ramlife

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

问题

RecycleView 中 checkbox 被选中后,上下滑动列表,滑动超过一屏内容时,再滑回来,checkbox 选中状态被清除。

原因

RecycleView 中使用 ViewHolder 来保存数据,当滑动超过一屏内容时,再滑回来,ViewHolder 数据需要重新加载,会触发 onBindViewHolder 这个方法。 一般在这个方法中,checkbox 会重新加载选择状态,这就容易出问题。

解决方法

使用额外的一个 list 或者 map 保存选中的数据,然后在 onBindViewHolder 中读取即可。

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);
        //holder.mCheckbox.setChecked(mValues.get(position).check);
        holder.mCheckbox.setChecked(((DataFragment)mFragment).getCheck(mValues.get(position).analysisId));
        holder.mIdView.setText(mValues.get(position).id);
        holder.mAnalysisIdView.setText(mValues.get(position).analysisId);

        DLog.d(TAG, "onBindViewHolder: " +
                ", id: " + mValues.get(position).id +
                ", holder check: " + mValues.get(position).check +
                ", list check: " + ((DataFragment)mFragment).getCheck(mValues.get(position).analysisId) +
                ", analysis id: " + mValues.get(position).analysisId);
    }

设置可以在 onCreateViewHolder 中:

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //return new ViewHolder(FragmentDataListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));

        final ViewHolder holder = new ViewHolder(FragmentDataListItemBinding.
                inflate(LayoutInflater.from(parent.getContext()), parent, false));

        holder.mCheckLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = holder.getAdapterPosition();
                PlaceholderItem item = mValues.get(position);
                boolean isChecked = !((DataFragment)mFragment).getCheck(item.analysisId);
                holder.mCheckbox.setChecked(isChecked);
                DLog.d(TAG, "onCreateViewHolder: " + "mCheckLayout: " + isChecked);
                Toast.makeText(v.getContext(), "click checkbox: " + item.id +
                        ", " + isChecked + ", position: " + position, Toast.LENGTH_SHORT).show();
                ((DataFragment)mFragment).setCheckList(item.analysisId, isChecked);
            }
        });

        return holder;
    }

设置也可以在 onBindViewHolder中:

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mItem = mValues.get(position);

        ...

        holder.mCheckLayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //int position = holder.getAdapterPosition();
                //PlaceholderItem item = mValues.get(position);
                boolean isChecked = !((DataFragment)mFragment).getCheck(holder.mItem.analysisId);
                holder.mCheckbox.setChecked(isChecked);
                DLog.d(TAG, "onCreateViewHolder: " + "mCheckLayout: " + isChecked);
                Toast.makeText(v.getContext(), "click checkbox: " + holder.mItem.id +
                        ", " + isChecked, Toast.LENGTH_SHORT).show();
                ((DataFragment)mFragment).setCheckList(holder.mItem.analysisId, isChecked);
            }
        });
    }

参考:

Recycleview来回滑动时选中的CheckBox消失问题
https://blog.csdn.net/weixin_47592544/article/details/123989788

RecycleView中使用CheckBox需要注意的问题
https://www.jianshu.com/p/86d15d487235

Recyclerview中使用CheckBox的问题总结
https://www.jianshu.com/p/4dc62e0800ce

Android高级控件之RecyclerView上放置CheckBox
https://blog.csdn.net/a_zhon/article/details/52928791

Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能
https://blog.csdn.net/qq_26787115/article/details/50609604

RecyclerView嵌入CheckBox带来的显示问题的解决办法
https://its301.com/article/qq_33748378/53133020

RecyclerView+CheckBox的使用
https://www.codenong.com/js606049e38538/

RecyclerView中使用CheckBox勾选混乱问题解决以及单选功能的实现
https://blog.csdn.net/ww897532167/article/details/77529605

posted on 2022-10-04 17:18  ramlife  阅读(345)  评论(0编辑  收藏  举报