1.問題
當在listview中的item設定checkbox後,滑動listview會出現checkbox選中狀态錯亂的問題,例如,選中第一個資料,當将listview滑動到底部再滑動到頂部時,選中狀态發生錯亂(可能變成第五條資料被選中)。
2.分析原因
假設android系統在listview給我們生成了10個view對象,這些view對象是共用的(隻是資料不同),第一個view對象在第一屏的時候需要顯示成”未選擇”狀态,而到了第二屏的時候,卻要顯示成”選擇”狀态,但由于是共用的同一個對象,當checkBox的狀态改變的時候,會調用onCheckedChange()方法,是以會出現狀态錯亂的問題。
3.解決辦法
以下給出解決辦法(部分邏輯代碼)
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.shoopingcrtlist_item, null);
viewHolder.choose = (CheckBox) convertView.findViewById(R.id.cbCheckBox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//排除checkbox錯亂的方法
viewHolder.choose.setTag(position);
viewHolder.choose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//先把View轉型為CheckBox
CheckBox c= (CheckBox) v;
//擷取目前控件的Tag,即與其綁定的position
int po = (int) c.getTag();
//判斷目前控件是否選中
if (c.isChecked()) {
//若選中,就根據綁定的position找到相對應的控件設定狀态為turn
datas.get(po).setCheck(true);
}else{
//若未選中,就根據綁定的position找到相對應的控件設定狀态為false
datas.get(po).setCheck(false);
}
}
});
viewHolder.choose.setChecked(datas.get(position).isCheck());
return convertView;
}