android listview item 错位,Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题...
首先赞下hyman大神
曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象。而ViewHolder没有抽象过。
。。
ViewHolder (用了一个集合+泛型管理存取view)
/**
* author : stone
* email : [email protected]
* time : 15/7/24 14 27
*/
public class StoneViewHolder {
private int mPosition;
private View mConvertView;
private SparseArray mViews; //管理listView-item中的view
public 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();
}
public View getConvertView() {
return mConvertView;
}
public static StoneViewHolder getInstance(Context context, int layoutId, int position, View
convertView, ViewGroup parent) {
if (convertView == null) {
return new StoneViewHolder(context, layoutId, position, parent);
} else {
StoneViewHolder holder = (StoneViewHolder) convertView.getTag();
holder.mPosition = position; //更新复用的convertView中 position
return holder;
}
}
public T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public void setTag(int viewId, T tag) {
getView(viewId).setTag(tag);
}
public 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 : [email protected]
* time : 15/7/24 14 46
*/
public abstract class StoneListAdapter extends BaseAdapter {
private List mData;
private Context mContext;
private int mLayoutID;
public StoneListAdapter(Context context, int layoutID, List data) {
this.mContext = context;
this.mLayoutID = layoutID;
this.mData = data == null ? new ArrayList() : data;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public T getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public 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(ListViewActivity.this, R.layout.activity_listview_item, mData) {
@Override
protected 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() {
@Override
public 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 {
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);
}
@Override
protected void getView(Context context, final StoneViewHolder holder, final int position) {
CheckBox cb = holder.getView(R.id.cb_check);
cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public 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
SparseBooleanArray 用于替代形如 HashMap
SparseIntArray 用于替代形如 HashMap
SparseLongArray 用于替代形如 HashMap
support.v4.util.SparseArrayCompat 提供了v4包相应平台的 SparseArray实现
android listview item 错位,Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题...相关推荐
- Android BaseAdapter和ViewHolder 优化 解决ListView的item抢焦点问题和item错乱问题
首先赞下hyman大神 曾经仅仅是简单的重写个BaseAdapter,将getView方法保持抽象.而ViewHolder没有抽象过. .. ViewHolder (用了一个集合+泛型管理存取view ...
- android listview边框颜色,Android实现带有边框的ListView和item的方法
本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...
- android Baseadapter 和 ViewHolder的使用
昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...
- android listview edittext 事件,Android ListView item中含有Edittext 中一些坑
今天做一个界面. 是 一个列表 .列表中有spinner,button,edittext等控件 首次打开需要展示,用户可以修改,修改后数据保存. 在保存Edittext控件上的值的时候,用的et ...
- Android ViewHolder 优化 ListView
ViewHolder 优化 ListView 参见这篇博客, 里面介绍了Android ListView 基础入门 简介以及深入优化 ViewHolder介绍 A ViewHolder object ...
- android笔试添加自定义服务,Android之Listview(item为单选题)自定义adapter,像考试时前面的10几道单选题的实现...
用于展现重复性的东西,Listview比较好用,看了别人的自定义Adapter(item是EditText,能够很好地获取到每一个item的EditText值).又由于在做项目的需要,故特制了一个it ...
- 我的Android进阶之旅------Android二级ListView列表的实现
实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...
- android 之适配器与json对象解析技术的联用的进一步优化(解决图片错位)
ListView优化的模型示意图 实例代码: 业务逻辑代码: package com.hsj.example.asyncloadxmldatademo08;import android.app.Pro ...
- android listview 横向滚动,Android支持水平滚动的ListView控件
前言 ListView是一个纵向滚动的列表视图,也有朋友嵌套HorizontalScrollView来实现,比如这里,但在ListView的API中明确指明了两者不可同时使用.本文分享一种办法,以方便 ...
最新文章
- CSS之 background-color: rgba(255,0,0,opacity number)
- MATLAB应用实战系列(五十一)-TXT数据的读取完美教程
- Java 面向对象:接口的理解
- 变量存储list python_Python变量类型(八)
- Linux 常用解压缩命令
- 第二阶段团队站立会议04
- [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
- word里双横线怎么打_word 双下横线怎么打出来
- android 粘性控件,RecyclerView 粘性标签库: 可结合 BRVAH 使用
- 升级到Chipmunk(2021.2.1)版本 遇到Run按钮不可用
- linux安装Aria2和部署AriaNg Web服务
- 粉丝看了教程成功发文章了,恭喜一下,并说下近期计划
- [附源码]java毕业设计高校奖学金评定管理系统
- Xcode不用数据线---真机测试
- Java----映射 map
- R语言学习笔记初级阶段
- linux服务器使用搜狗输入法,linux下使用搜狗输入法皮肤(.ssf)(示例代码)
- Strange Characters On Budgetary Control Result Page [ID 1439888.1]
- 重庆交通大学c语言上机试题,重庆交通大学2021硕士招生考试《C语言程序设计》复试大纲...
- 21.04.07-直角坐标系的Location类
热门文章
- 最详细的创建虚拟机_创建_安装配置_配置启动向导
- leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)
- leetcode 303. 区域和检索 - 数组不可变(Java版)
- 【Python】选择Python2还是Python3?
- Java知识整理——垃圾回收
- Gradle增量编译(六)
- STL泛型编程之迭代器
- 使用RNN解决句子对匹配问题的常见网络结构
- zoj2968 Difference Game
- [leetcode]112.路径总和