首页 > 其他分享 >RecycleView 滑动后,checkbox 被清除,恢复为未选中状态

RecycleView 滑动后,checkbox 被清除,恢复为未选中状态

时间:2022-10-04 17:22:33浏览次数:96  
标签:checkbox get mValues RecycleView ViewHolder position 滑动 holder

问题

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

参考:

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

标签:checkbox,get,mValues,RecycleView,ViewHolder,position,滑动,holder
From: https://www.cnblogs.com/ramlife/p/16754085.html

相关文章