一怠褐、復(fù)用問題
為了節(jié)省內(nèi)存的消耗还惠,在Android開發(fā)中ListView的單元格是被復(fù)用的,也就是說當(dāng)ListView加載數(shù)據(jù)是只提供有限個(gè)數(shù)個(gè)單元格痕惋,當(dāng)超出這個(gè)范圍后,后面的數(shù)據(jù)循環(huán)復(fù)用之前的單元格娃殖。從內(nèi)存的開銷上來說這是非常好的策略值戳,但在開發(fā)中,我們往往會(huì)面臨一些因?yàn)閺?fù)用導(dǎo)致數(shù)據(jù)錯(cuò)落的問題炉爆,在listview中使用checkbox時(shí)堕虹,checkbox的選中狀態(tài)就會(huì)因?yàn)閱卧竦膹?fù)用導(dǎo)致錯(cuò)亂。
二芬首、解決方案:
1.將CheckBox的選中狀態(tài)交給Bean類控制
2.isCheck負(fù)責(zé)管理checkbox的狀態(tài)赴捞,
3.在OnCheckChanageListener事件中首先將數(shù)據(jù)對應(yīng)的checkbox狀態(tài)保存起來
4.在給checkbox設(shè)置狀態(tài)時(shí),同樣通過bean對象的isCheck屬性來判斷
因?yàn)閏heckbox的默認(rèn)狀態(tài)就是false郁稍,這時(shí)其實(shí)就會(huì)觸發(fā)OnCheckChangeListener赦政,將checkbox的狀態(tài)保存下來,今后每一次狀態(tài)的改變都會(huì)在OnCheckChangeListener事件中通過setIsCheck方法保存下來耀怜,而在后面給對應(yīng)的每一個(gè)單元格上的checkbox添加狀態(tài)時(shí)設(shè)置的是數(shù)據(jù)保存過的狀態(tài)恢着,因此不會(huì)復(fù)用
public class Node{
private String id;
private String pId;
private String name;
........
/** * 父Node */
private Node parent;
/** * 選中屬性 */
private boolean isCheck;
}
提供get/set方法
提供唯一的hash值用來做比較,稍后再List中會(huì)用到
@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<>();//定義一個(gè)集合負(fù)責(zé)管理被選中的數(shù)據(jù)
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());//點(diǎn)擊判斷是否被選中
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}