这里RecyclerView嵌入CheckBox时滑动列表,列表item中的会产生错位现象,解决这个问题需在Adapter中onBindViewHolder方法中处理。下面的例子是列表单选,所以只设定了一个整型变量来保存当前选中的CheckBox,若是多选,可用List保存列表所有CheckBox的选中状态。
1. 设置CheckBox的标签为position+1,即CheckBox的标签从1开始,choosePosition的初始值为0,即最开始是无任何CheckBox选中。
2. 监听CheckBox状态改变事件,当CheckBox从非选中变成选中的状态,就把这个CheckBox的标签值赋给choosePosition。
3. 监听CheckBox点击事件,每次点击都刷新列表。
4. 当刷新列表时,就会到onBindViewHolder方法,判断CheckBox的position+1是否等于choosePosition,是则设置为选中状态,否则设置为非选中状态。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private Context context;
private int choosePosition = 0;
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (context == null) {
context = parent.getContext();
}
View view = LayoutInflater.from(context).inflate(R.layout.item_list,parent,false);
return new MeetingRoomAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final Integer tag = position+1;
holder.checkBoxChoose.setTag(tag);
//先触发checkBox状态改变事件
holder.checkBoxChoose.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int tagCheckBox = (Integer) buttonView.getTag();
if (isChecked) {
choosePosition = tagCheckBox;
}
}
});
//后触发checkBox点击事件
holder.checkBoxChoose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
notifyDataSetChanged();
}
});
if (position+1 == choosePosition) {
holder.checkBoxChoose.setChecked(true);
}else {
holder.checkBoxChoose.setChecked(false);
}
holder.checkBoxChoose.setScaleX(1.3f);//改变CheckBox的尺寸
holder.checkBoxChoose.setScaleY(1.3f);
}
@Override
public int getItemCount() {
return demoList.size();
}
static class ViewHolder extends RecyclerView.ViewHolder {
CheckBox checkBoxChoose;
private ViewHolder(View itemView) {
super(itemView);
checkBoxChoose = itemView.findViewById(R.id.checkBox);
}
}
}