关键代码:

// 记录选中的Item
private int selectedPosition = -1;

@Override
public void onBindViewHolder(@NonNull final ItemViewHolder holder, final int position) {
holder.mTV.setText(list.get(position).getName());
holder.mCB.setChecked(list.get(position).isChecked());
// 要实现单选的话,就要选择点击事件,然后在点击事件中根据选择状态做变化,不要选用setOnCheckedChangeListener()
holder.mCB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.mCB.post(new Runnable() {
@Override
public void run() {
if(selectedPosition != -1){
list.get(selectedPosition).setChecked(false);
// notifyItemChanged必须在UI线程中执行,否则会报:
// java.lang.IllegalStateException: Cannot call this method
// while RecyclerView is computing a layout or scrolling
notifyItemChanged(selectedPosition);
}
list.get(position).setChecked(holder.mCB.isChecked());

if(holder.mCB.isChecked()){
selectedPosition = position;
}else{
selectedPosition = -1;
}
}
});
}
});


}

对CheckBox的事件处理应该用OnClickListener,然后在点事件里处理CheckBox的选中逻辑。

​Java版本Demo​​​​Kotlin版本​