美文网首页
ListView || RecycleView 中嵌套Check

ListView || RecycleView 中嵌套Check

作者: Cloverss | 来源:发表于2018-03-18 16:28 被阅读52次

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

    相关文章

      网友评论

          本文标题:ListView || RecycleView 中嵌套Check

          本文链接:https://www.haomeiwen.com/subject/tcneqftx.html