Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题
首先赞下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错乱问题相关推荐
- android listview item 错位,Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题...
首先赞下hyman大神 曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象.而ViewHolder没有抽象过. .. ViewHolder (用了一个集合+泛型管理存取view ...
- android Baseadapter 和 ViewHolder的使用
昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...
- Android ViewHolder 优化 ListView
ViewHolder 优化 ListView 参见这篇博客, 里面介绍了Android ListView 基础入门 简介以及深入优化 ViewHolder介绍 A ViewHolder object ...
- 基于Android官方AsyncListUtil优化经典ListView分页加载机制(二)
基于Android官方AsyncListUtil优化经典ListView分页加载机制(二) 我写的附录文章1,介绍了如何使用Android官方的分页加载框架AsyncListUtil优化改进常见的Re ...
- Android BaseAdapter与ListView的使用
Android BaseAdapter与ListView的使用 定义:BaseAdapterextends Objectimplements ListAdapter SpinnerAdapter Ba ...
- 安卓APP_ 控件(10)—— ListView可上下滑动的列表(重要)与ViewHolder优化
摘自:安卓APP_ 控件(10)-- ListView可上下滑动的列表(重要)与ViewHolder优化 作者:丶PURSUING 发布时间: 2021-04-12 23:28:27 网址:https ...
- 自定义BaseAdapter完美解决ListView异常:java.lang.IllegalStateException
2019独角兽企业重金招聘Python工程师标准>>> 在我们Android 开发中,ListView是在常用不过的控件了.但是有时候会爆出这种异常,就搞得好尴尬了. 明明我们在代码 ...
- android 解决listview.notifyDataSetChanged刷新时Imageloader加载图片闪烁问题
今天,简单讲讲android里再listview调用notifyDataSetChanged刷新界面时,Imageloader加载图片会闪烁的问题. 最近,发现app里的listview图片会出现闪烁 ...
- android自定义adapter怎么优化,Android必学-BaseAdapter的使用与优化
数据适配器--BaseAdapter 可以自定义View或者利用参数中的convertView 一.逗比式 没有任何优化处理,每次都创建新的View,设置控件,效率极其低下 ``` @Override ...
最新文章
- 第2周第4课:set_uid、set_gid、stick_bit、软(硬)链接文件
- 算法专题 二分法 普及组【2015】四2 C++版
- 技术向:一文读懂卷积神经网络
- 注入工具的原理和开发
- 揭开HTTPS的神秘面纱
- 字节跳动武汉招聘 2000 人,距离大厂 Offer,你还差这篇 Java 干货!| 原力计划...
- 云服务器里可以放多少网站,一台云服务器上可以放多少个网站
- 数据结构与算法 - 图论
- 几种常见排序算法时间复杂度
- ata计算机模拟考试系统,滨湖教育在线模拟考试系统
- Bridge的VLAN接口模式
- lumion实例渲染6.2
- Python Selenium自动化测试框架 Test Suite测试套件
- Excel-VLOOKUP函数的进阶使用
- 大数据电信客服项目一——数据生成
- 突发:国家发布平台经济反垄断指南:阿里、美团、京东暴跌
- 微信小程序开发初学:输入框 - input
- 软件知识储备02_KeiL的使用技巧(不定期更新)
- A class file was not written
- MPEG音频文件格式(包括MP3文件格式)(1)
热门文章
- python 装饰器入门
- [InnoDB系列] -- SHOW INNODB STATUS 探秘
- [分享]学历与学习力
- Self-Tuning Spectral Clustering论文阅读和代码理解
- 冠军杜兰特和Deta比赛
- Leetcode 268. 缺失数字 解题思路及C++实现
- 无线网络国际会议排名(zz)
- Windows环境下32位汇编程序设计C版code--第五章(一)
- navicat连接oracle无监听程序_一个Java程序员的成长历程(022天)
- Access Your Office on Your Phone