这里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); } } }