ListView || RecycleView 中嵌套Check

2018-03-18  本文已影响52人  Cloverss

部分参考: 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 的 “全选” “单选” ,想必大家都能迎刃而解,如果有疑问可以私信。

上一篇下一篇

猜你喜欢

热点阅读