部分参考: Smilyyy,该链接中博主会把原理讲得比较详细,大家可以参考一下。
首先这个是在前一段工作过程中遇到的问题,当时纠结了许久不能解决,今天来记录下,避免遇到同样的问题。项目比较老了,没有用到RecycleView,但是,即便用RecycleView,也会碰到同样的问题(亲测)。
问题描述:
在ListView中如果有CheckBox控件,不做特殊处理的情况下,并且ListView的item超过了“一屏”,这时候,如果你点击了CheckBox,并且开始滑动ListView(最简单的方法,将你的CheckBox滑出屏幕外,再滑回来),就会发生令人很烦的事情----CheckBox选中的item 错乱了。。。
下图是修改前
修改前.gif解决办法:
在我们的 Adapter中增加一个记录“选中位置”的数据集,HashMap
也好,SparseBooleanArray
也可以,看个人。
不多说 上代码:
这里我用的是SparseBooleanArray
,具体用什么都是一样的(⊙o⊙)…。
Adapter 代码:
public class LvAdapter extends BaseAdapter {
private List<Item> data;
private SparseBooleanArray hasCheckedMap; //这里大家也可以用HashMap
public LvAdapter(List<Item> data) {
this.data = data;
hasCheckedMap = new SparseBooleanArray();
}
public SparseBooleanArray getHasCheckedMap() {
return hasCheckedMap;
}
@Override
public int getCount() {
return data == null ? 0 : data.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
final Item item = data.get(position);
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.lv_item, null);
viewHolder = new ViewHolder();
viewHolder.tv = convertView.findViewById(R.id.tv);
viewHolder.cb = convertView.findViewById(R.id.cb);
convertView.setTag(viewHolder);
} else {
viewHolder = ((ViewHolder) convertView.getTag());
}
viewHolder.tv.setText(item.getRowNo());
viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) { //如果选中,就put进去
hasCheckedMap.put(position, true);
} else { //否则,就delete
hasCheckedMap.delete(position);
}
item.setChecked(isChecked);
}
});
viewHolder.cb.setChecked(hasCheckedMap.get(position));
return convertView;
}
private static class ViewHolder {
TextView tv;
CheckBox cb;
}
修改后如图
修改后.gif到这里,基本 CheckBox混乱的问题就基本解决了
接下来至于实现 ListView中 CheckBox 的 “全选” “单选” ,想必大家都能迎刃而解,如果有疑问可以私信。
网友评论