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;
}