一、复用问题
为了节省内存的消耗,在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