首先赞下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错乱问题...相关推荐

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

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

  2. android listview边框颜色,Android实现带有边框的ListView和item的方法

    本文实例讲述了Android实现带有边框的ListView和item的方法.分享给大家供大家参考,具体如下: 想为ListView和item四周添加边框有两种方法: 1.贴一张带有边框效果的背景图 2 ...

  3. android Baseadapter 和 ViewHolder的使用

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

  4. android listview edittext 事件,Android ListView item中含有Edittext 中一些坑

    今天做一个界面.  是 一个列表 .列表中有spinner,button,edittext等控件 首次打开需要展示,用户可以修改,修改后数据保存. ‍‍在保存Edittext控件上的值的时候,用的et ...

  5. Android ViewHolder 优化 ListView

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

  6. android笔试添加自定义服务,Android之Listview(item为单选题)自定义adapter,像考试时前面的10几道单选题的实现...

    用于展现重复性的东西,Listview比较好用,看了别人的自定义Adapter(item是EditText,能够很好地获取到每一个item的EditText值).又由于在做项目的需要,故特制了一个it ...

  7. 我的Android进阶之旅------Android二级ListView列表的实现

    实现如下图所示的二级列表效果 首先是在布局文件中,布局两个ListView,代码如下: <LinearLayout xmlns:android="http://schemas.andr ...

  8. android 之适配器与json对象解析技术的联用的进一步优化(解决图片错位)

    ListView优化的模型示意图 实例代码: 业务逻辑代码: package com.hsj.example.asyncloadxmldatademo08;import android.app.Pro ...

  9. android listview 横向滚动,Android支持水平滚动的ListView控件

    前言 ListView是一个纵向滚动的列表视图,也有朋友嵌套HorizontalScrollView来实现,比如这里,但在ListView的API中明确指明了两者不可同时使用.本文分享一种办法,以方便 ...

最新文章

  1. CSS之 background-color: rgba(255,0,0,opacity number)
  2. MATLAB应用实战系列(五十一)-TXT数据的读取完美教程
  3. Java 面向对象:接口的理解
  4. 变量存储list python_Python变量类型(八)
  5. Linux 常用解压缩命令
  6. 第二阶段团队站立会议04
  7. [网络安全自学篇] 四.实验吧CTF实战之WEB渗透和隐写术解密
  8. word里双横线怎么打_word 双下横线怎么打出来
  9. android 粘性控件,RecyclerView 粘性标签库: 可结合 BRVAH 使用
  10. 升级到Chipmunk(2021.2.1)版本 遇到Run按钮不可用
  11. linux安装Aria2和部署AriaNg Web服务
  12. 粉丝看了教程成功发文章了,恭喜一下,并说下近期计划
  13. [附源码]java毕业设计高校奖学金评定管理系统
  14. Xcode不用数据线---真机测试
  15. Java----映射 map
  16. R语言学习笔记初级阶段
  17. linux服务器使用搜狗输入法,linux下使用搜狗输入法皮肤(.ssf)(示例代码)
  18. Strange Characters On Budgetary Control Result Page [ID 1439888.1]
  19. 重庆交通大学c语言上机试题,重庆交通大学2021硕士招生考试《C语言程序设计》复试大纲...
  20. 21.04.07-直角坐标系的Location类

热门文章

  1. 最详细的创建虚拟机_创建_安装配置_配置启动向导
  2. leetcode 368. Largest Divisible Subset | 368. 最大整除子集(动态规划详解)
  3. leetcode 303. 区域和检索 - 数组不可变(Java版)
  4. 【Python】选择Python2还是Python3?
  5. Java知识整理——垃圾回收
  6. Gradle增量编译(六)
  7. STL泛型编程之迭代器
  8. 使用RNN解决句子对匹配问题的常见网络结构
  9. zoj2968 Difference Game
  10. [leetcode]112.路径总和