首先:参考了这篇翻译的文章:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

文章中关于说的Android中的Recycler比较模糊,Android会维持屏幕中显示的item+1个对象。但是复用的时候选择哪个对象来复用的机制并不明确,具体用的是什么数据结构,求告知。。。肯定不是简单的FIFO或LIFO。

关于checkBox,选中了之后,下滑之后返回就消失的问题。有以下两种方式供大家参考:

data是给TextView显示的。

isChecked是用来记录CheckBox是否选中的。

ArrayList<String> data;
ArrayList<Boolean> isChecked;
 class Holder {
TextView name;
CheckBox box;
}

  

一:

用onClickedListener,使用这个监听器可以简单的避开CheckedBox选中消失的问题。

其中:holder.box.setTag(i);用来给监听器指明选择的索引。
 @Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view == null) {
view = LayoutInflater.from(context).inflate(R.layout.list_item, null);
holder = new Holder();
holder.box = (CheckBox) view.findViewById(R.id.cb_isChecked);
holder.name = (TextView) view.findViewById(R.id.tv_name);
view.setTag(holder);
} else {
holder = (Holder) view.getTag();
}
holder.name.setText(data.get(i));
System.out.println("即将改变成" + isChecked.get(i) + "i" + i);
holder.box.setChecked(isChecked.get(i));
  
holder.box.setTag(i);
holder.box.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
boolean hold = isChecked.get((Integer) view.getTag());
isChecked.set((Integer) view.getTag(), !hold);
System.out.println("compoundButton.getTag()" + view.getTag());
}
});
return view;
}

二.用onCheckedListener, 使用这个监听器,需要注意一些问题。

代码:和上面的一样,就是把onClickListener改成onCheckedlistener,结果就出现了选中消失的问题。

仔细看了在logcat中看了输出的结果,发现问题的所在:

当我们选中一个item时,假设此时item1被选中,下拉列表,到时item1隐藏,item10出现,并复用了item1的结构,由于在getView函数中item10被赋值是false,此时,onCheckedListener监听器响应了(如果使用onClickedListener就没有以下问题,因为它再此时不会响应),问题来了:

  因为在onCheckedListener根据view.getTag()来获得索引,而此时的索引是1,就是item1对象时setTag时留下的。

最终导致此时监听器把用来存储布尔值的线性表的索引1的位置赋值成了item10的值。

根据问题的成因,我们需要在 onCheckedListener响应前,让view.getTag()获得正确的索引,其实很简单只需要将

holder.box.setTag(i);放到holder.box.setChecked(isChecked.get(i));前面就可以了。

此解决方案的完整代码:

public class ListAdapter2 extends BaseAdapter {
ArrayList<String> data;
ArrayList<Boolean> isChecked;
Context context;
Holder holder;
public ListAdapter2(Context context, ArrayList<String> data, ArrayList<Boolean> isChecked) {
this.context = context;
this.data = data;
this.isChecked = isChecked;
} @Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int i) {
return data.get(i);
} @Override
public long getItemId(int i) {
return i;
} @Override
public View getView(int i, View view, ViewGroup viewGroup) {
if(view == null) {
view = LayoutInflater.from(context).inflate(R.layout.list_item, null);
holder = new Holder();
holder.box = (CheckBox) view.findViewById(R.id.cb_isChecked);
holder.name = (TextView) view.findViewById(R.id.tv_name);
view.setTag(holder); } else {
holder = (Holder) view.getTag();
} holder.name.setText(data.get(i));
System.out.println("即将改变成" + isChecked.get(i) + "i" + i);
holder.box.setTag(i); holder.box.setChecked(isChecked.get(i)); holder.box.setOnCheckedChangeListener(new CheckedListener());
return view;
} class CheckedListener implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
isChecked.set((Integer) compoundButton.getTag(), b);
System.out.println("compoundButton.getTag()" + compoundButton.getTag() + "b" + b);
}
} class Holder {
TextView name;
CheckBox box;
}
}

  

抛砖引玉:关于Android的ListView中CheckBox错乱的更多相关文章

  1. ListView中CheckBox错乱解决

    思路: ListView在复用的时候会出现很多问题,CheckBox状态会出现错乱,解决思路: 1.使用Map集合的键值对的形式来存放position位置上CheckBox的状态 2.监听CheckB ...

  2. Android 解决listview中checkBox错位选择

    假如ListView,分成2页(或者设置数据可以纵向拉,可隐藏),每页3条数据,每个Listview的Item 里面有个checkBox,现在,当我选择第一页的前两天数据,翻到第二页,竟然第二页后两条 ...

  3. android UI进阶之实现listview中checkbox的多选与记录

    今天继续和大家分享涉及到listview的内容.在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作.比如在一个 清单页面,我们需要记录用户勾选了哪些条目.这个的实现并 ...

  4. 【转】android UI进阶之实现listview中checkbox的多选与记录--不错

    原文网址:http://www.cnblogs.com/notice520/archive/2012/02/17/2355415.html 今天继续和大家分享涉及到listview的内容.在很多时候, ...

  5. android ListView中CheckBox错位的解决

    貌似已经非常晚了,可是还是想记下笔记,想让今天完满. 在ListView中加了checkBox,但是发现点击改变其选中状态的时候,发现其位置错乱.状态改变的并非你选中的,百思不得其解.后面通过上网查资 ...

  6. 如何在Android的ListView中构建CheckBox和RadioButton列表(支持单选和多选的投票项目示例)

    引言 我们在android的APP开发中有时候会碰到提供一个选项列表供用户选择的需求,如在投票类型的项目中,我们提供一些主题给用户选择,每个主题有若干选项,用户对这些主题的选项进行选择,然后提交. 本 ...

  7. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. 实现listview中checkbox的多选与记录

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  9. Android关于ListView中item与控件抢夺焦点的那些事

    在开发中,listview可以说是我们使用最频繁的控件之一了,但是关于listview的各种问题也是很多.当我们使用自定义布局的Listview的时候,如果在item的布局文件里面存在Button或者 ...

随机推荐

  1. EIGRP汇总

    转自:http://myhat.blog.51cto.com/391263/193189/ 实验目的:1.理解EIGRP的自动汇总的缺点2.配置EIGRP手工汇总的方法A>>>还是老 ...

  2. 动手动脑之查看String.equals()方法的实现代码及解释

    动手动脑 请查看String.equals()方法的实现代码,注意学习其实现方法. 第一个是false,后三个是true. package stringtest; public class Strin ...

  3. javascript压缩图片无刷新上传

    首先要说明,该方式我没有实现成功,主要问题点是压缩后能拿到压缩后图片地址,确不知道怎么上传上去,如果有哪位大牛可以指点一二,万分感谢. 图片压缩代码: compress: function(sourc ...

  4. 轻松学习Linux之Shell文件和目录属性详解

    轻松学习Linux之Shell文件和目录属性详解 轻松学习Linux之理解Sitcky 轻松学习Linux之理解umask 轻松学习Linux之理解SUID&SGUID 本系列多媒体教程已完成 ...

  5. Java 类型信息

    <Thinking in Java 4th>第14章 类型信息 运行时类型信息(Run-Time Type Identification)使得你可以在程序运行时发现和使用类型信息. 14. ...

  6. hdu4135-Co-prime & Codeforces 547C Mike and Foam (容斥原理)

    hdu4135 求[L,R]范围内与N互质的数的个数. 分别求[1,L]和[1,R]和n互质的个数,求差. 利用容斥原理求解. 二进制枚举每一种质数的组合,奇加偶减. #include <bit ...

  7. C#UDP同步实例

    差不多有一个礼拜总算有点进步. 代码很简单,只是为了实现功能. 网络上的资源是很多,除了不能用的,就是抄来抄去,是在乏味浪费时间. 说一下代码背景:实现的功能是发送端发送消息,接收端接收后立即响应,发 ...

  8. C++11能用智能指针

    [C++11能用智能指针] shared_ptr 是一引用计数 (reference-counted) 指针,其行为与一般 C++ 指针即为相似.在 TR1 的实现中,缺少了一些一般指针所拥有的特色, ...

  9. 关于缺省路由传递问题的探讨(上)[ip default-network、ip default-gateway等]

    指定缺省路由(last resort gateway)的指令供有3种,可以分成两类:   1.Ip default-gateway   仅在 "no ip routing" (关闭 ...

  10. git 安装与使用场景

    1. 安装 yum install git #自动安装依赖 centos sudo apt-get install git #ubutu http://msysgit.github.io/ #wind ...