首先赞下hyman大神

曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象。而ViewHolder没有抽象过。

。。

ViewHolder (用了一个集合+泛型管理存取view)

/*** author : stone* email  : aa86799@163.com* time   : 15/7/24 14 27*/
public class StoneViewHolder {private int mPosition;private View mConvertView;private SparseArray<View> mViews;  //管理listView-item中的viewpublic StoneViewHolder(Context context, int layoutId, int position, ViewGroup parent) {this.mPosition = position;this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);this.mConvertView.setTag(this);this.mViews = new SparseArray<View>();}public View getConvertView() {return mConvertView;}public static StoneViewHolder getInstance(Context context, int layoutId, int position, ViewconvertView, ViewGroup parent) {if (convertView == null) {return new StoneViewHolder(context, layoutId, position, parent);} else {StoneViewHolder holder = (StoneViewHolder) convertView.getTag();holder.mPosition = position;  //更新复用的convertView中  positionreturn holder;}}public <T extends View>  T getView(int viewId) {View view = mViews.get(viewId);if (view == null) {view = mConvertView.findViewById(viewId);mViews.put(viewId, view);}return (T) view;}public <T> void setTag(int viewId, T tag) {getView(viewId).setTag(tag);}public <T> T getTag(int viewId) {return (T) getView(viewId).getTag();}/*------------------------  设置view属性(以后扩展) --------------------------------*/public StoneViewHolder setText(int viewId, String text) {((TextView)getView(viewId)).setText(text);return this;}public StoneViewHolder setText(int viewId, int resId) {//R.string.((TextView)getView(viewId)).setText(resId);return this;}public StoneViewHolder setImageBitmap(int viewId, Bitmap bitmap) {((ImageView)getView(viewId)).setImageBitmap(bitmap);return this;}public StoneViewHolder setImageResource(int viewId, int resId) {((ImageView)getView(viewId)).setImageResource(resId);return this;}
}

Adapter

/*** author : stone* email  : aa86799@163.com* time   : 15/7/24 14 46*/
public abstract class StoneListAdapter<T> extends BaseAdapter {private List<T> mData;private Context mContext;private int mLayoutID;public StoneListAdapter(Context context, int layoutID, List<T> data) {this.mContext = context;this.mLayoutID = layoutID;this.mData = data == null ? new ArrayList<T>() : data;}@Overridepublic int getCount() {return mData.size();}@Overridepublic T getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {StoneViewHolder holder = StoneViewHolder.getInstance(mContext, mLayoutID, position,convertView, parent);getView(mContext, holder, position);return holder.getConvertView();}protected abstract void getView(Context context, StoneViewHolder holder, int position);}

在ListViewActivity中使用

stoneBaseAdapter = new StoneListAdapter<User>(ListViewActivity.this, R.layout.activity_listview_item, mData) {@Overrideprotected void getView(Context context, final StoneViewHolder holder, final int position) {User user = getItem(position);holder.setText(R.id.tv_id, user.getId()).setText(R.id.tv_name, user.getName()).setText(R.id.tv_age, user.getAge() + "");holder.getView(R.id.btn_test).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {}});}
};

关于Adapter中View抢焦点:

假设 listView.setOnItemClickListener(listener);   且item中的  button.setOnClickListener(listener);

无论怎么点击,button会一直被触发...

仅仅须要在item的root-layout中 加入 一个属性:   android:descendantFocusability="blocksDescendants"

关于item-view复用后。显示混乱:

有时条目过多,滑动到下一屏数据时。有些view复用后,view的状态(比方CheckBox的选种状态。ImageView的图片反复出现)会变乱。

一般处理呢。须要有一个机制,来管理一种相应关系: 当前position相应哪种状态

比方说checkBox选中状态混乱:

class MyAdapter extends StoneListAdapter<User> {private SparseBooleanArray mCheckStateArray;public MyAdapter(Context context, int layoutID, List data) {super(context, layoutID, data);this.mCheckStateArray = new SparseBooleanArray();}public void setChecked(int position, boolean isChecked) {mCheckStateArray.put(position, isChecked);}public boolean isChecked(int position) {return mCheckStateArray.get(position);}@Overrideprotected void getView(Context context, final StoneViewHolder holder, final int position) {CheckBox cb = holder.getView(R.id.cb_check);cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {setChecked(position, isChecked);//记录状态。防缓存显示}});cb.setChecked(isChecked(position));}}

关于SparseArray

SparseArray 内部实现是Array数组。当长度不够时,会调用System.arrayCopy
        内部有 keys和values两个数组。

put(key, value); 二分法查找key应该存放的位置  由于key是Integer类型
        put、get时 两个数组都是操作的同一个位置上的数据

SparseArray 用于替代形如  HashMap<Integer, Object>
    SparseBooleanArray 用于替代形如  HashMap<Integer, Boolean>
    SparseIntArray 用于替代形如  HashMap<Integer, Integer>
    SparseLongArray 用于替代形如  HashMap<Integer, Long>

support.v4.util.SparseArrayCompat 提供了v4包相应平台的 SparseArray实现

转载于:https://www.cnblogs.com/yfceshi/p/6786035.html

Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题相关推荐

  1. android listview item 错位,Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题...

    首先赞下hyman大神 曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象.而ViewHolder没有抽象过. .. ViewHolder (用了一个集合+泛型管理存取view ...

  2. android Baseadapter 和 ViewHolder的使用

    昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...

  3. Android ViewHolder 优化 ListView

    ViewHolder 优化 ListView 参见这篇博客, 里面介绍了Android ListView 基础入门 简介以及深入优化 ViewHolder介绍 A ViewHolder object ...

  4. 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)

    基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...

  5. Android BaseAdapter与ListView的使用

    Android BaseAdapter与ListView的使用 定义:BaseAdapterextends Objectimplements ListAdapter SpinnerAdapter Ba ...

  6. 安卓APP_ 控件(10)—— ListView可上下滑动的列表(重要)与ViewHolder优化

    摘自:安卓APP_ 控件(10)-- ListView可上下滑动的列表(重要)与ViewHolder优化 作者:丶PURSUING 发布时间: 2021-04-12 23:28:27 网址:https ...

  7. 自定义BaseAdapter完美解决ListView异常:java.lang.IllegalStateException

    2019独角兽企业重金招聘Python工程师标准>>> 在我们Android 开发中,ListView是在常用不过的控件了.但是有时候会爆出这种异常,就搞得好尴尬了. 明明我们在代码 ...

  8. android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题

    今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...

  9. android自定义adapter怎么优化,Android必学-BaseAdapter的使用与优化

    数据适配器--BaseAdapter 可以自定义View或者利用参数中的convertView 一.逗比式 没有任何优化处理,每次都创建新的View,设置控件,效率极其低下 ``` @Override ...

最新文章

  1. 第2周第4课:set_uid、set_gid、stick_bit、软(硬)链接文件
  2. 算法专题 二分法 普及组【2015】四2 C++版
  3. 技术向:一文读懂卷积神经网络
  4. 注入工具的原理和开发
  5. 揭开HTTPS的神秘面纱
  6. 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...
  7. 云服务器里可以放多少网站,一台云服务器上可以放多少个网站
  8. 数据结构与算法 - 图论
  9. 几种常见排序算法时间复杂度
  10. ata计算机模拟考试系统,滨湖教育在线模拟考试系统
  11. Bridge的VLAN接口模式
  12. lumion实例渲染6.2
  13. Python Selenium自动化测试框架 Test Suite测试套件
  14. Excel-VLOOKUP函数的进阶使用
  15. 大数据电信客服项目一——数据生成
  16. 突发:国家发布平台经济反垄断指南:阿里、美团、京东暴跌
  17. 微信小程序开发初学:输入框 - input
  18. 软件知识储备02_KeiL的使用技巧(不定期更新)
  19. A class file was not written
  20. MPEG音频文件格式(包括MP3文件格式)(1)

热门文章

  1. python 装饰器入门
  2. [InnoDB系列] -- SHOW INNODB STATUS 探秘
  3. [分享]学历与学习力
  4. Self-Tuning Spectral Clustering论文阅读和代码理解
  5. 冠军杜兰特和Deta比赛
  6. Leetcode 268. 缺失数字 解题思路及C++实现
  7. 无线网络国际会议排名(zz)
  8. Windows环境下32位汇编程序设计C版code--第五章(一)
  9. navicat连接oracle无监听程序_一个Java程序员的成长历程(022天)
  10. Access Your Office on Your Phone