问题
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