解决ListView中CheckBox复用的问题

一、复用问题

为了节省内存的消耗,在Android开发中ListView的单元格是被复用的,也就是说当ListView加载数据是只提供有限个数个单元格,当超出这个范围后,后面的数据循环复用之前的单元格。从内存的开销上来说这是非常好的策略,但在开发中,我们往往会面临一些因为复用导致数据错落的问题,在listview中使用checkbox时,checkbox的选中状态就会因为单元格的复用导致错乱。

二、解决方案:

1.将CheckBox的选中状态交给Bean类控制
2.isCheck负责管理checkbox的状态,
3.在OnCheckChanageListener事件中首先将数据对应的checkbox状态保存起来
4.在给checkbox设置状态时,同样通过bean对象的isCheck属性来判断

因为checkbox的默认状态就是false,这时其实就会触发OnCheckChangeListener,将checkbox的状态保存下来,今后每一次状态的改变都会在OnCheckChangeListener事件中通过setIsCheck方法保存下来,而在后面给对应的每一个单元格上的checkbox添加状态时设置的是数据保存过的状态,因此不会复用

public class Node{

private String id;
private String pId;
private String name;
........
/** * 父Node */
private Node parent;
/** * 选中属性 */
private boolean isCheck;
}
提供get/set方法
提供唯一的hash值用来做比较,稍后再List中会用到
@Override
public boolean equals(Object obj) {    
boolean f = obj instanceof Node && id.equals(((Node) obj).getId());  
  return f;}
@Override
public int hashCode() {   
 return id.hashCode();
}

在适配器中

private List<Node> mChoseData = new ArrayList<>();//定义一个集合负责管理被选中的数据
 ViewHolder viewHolder = null; 
if (convertView == null) {   
  convertView = mInflater.inflate(R.layout.lv_item_check, parent, false);     viewHolder = new ViewHolder();
viewHolder.label = (TextView) convertView .findViewById(R.id.tv_label);
viewHolder.checkBox=(CheckBox)convertView.findViewById(R.id.check_note);  
viewHolder.checkBox.setTag(node.getId());//点击判断是否被选中 
convertView.setTag(viewHolder);
 } 
else {   
  viewHolder = (ViewHolder) convertView.getTag();
 }

Paste_Image.png
Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容