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