滚动时,在recyclerView中取消选中复选框

我有一个光标,它检索成分列表并填充适配器,然后将其分配给具有复选框的回收器视图。 我得到的问题是,当我检查一组复选框并向下滚动时,从顶部选择的那些,取消选择,反之亦然,或者在某些情况下,如果我从顶部选择三个,从底部选择三个被选中。 我需要确保,最初没有选择任何内容,即使我上下滚动,所选的选项应保持选中状态并需要跟踪。

这是可以scrolable的列表。

在此处输入图像描述

这是我的代码:

class RecipeDetailCursorAdapter extends CursorRecyclerViewAdapter { private int mBrownColor; private int mGreenColor; private int mCheckItems; private ItemsCheckedCallback mCheckedCallback; RecipeDetailCursorAdapter(Context context, Cursor cursor, ItemsCheckedCallback callback) { super(context, cursor); mCheckedCallback = callback; mBrownColor = ContextCompat.getColor(mContext, R.color.colorTextBrown); mGreenColor = ContextCompat.getColor(mContext, R.color.colorTextGreen); mCheckItems = 0; } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, Cursor cursor) { String taskName = cursor.getString(cursor.getColumnIndexOrThrow(MascotHelper.RecipeTask.NAME)); ((RecipeTaskHolder) viewHolder).bindView(taskName); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.recipe_task_item, parent, false); return new RecipeTaskHolder(v); } private class RecipeTaskHolder extends RecyclerView.ViewHolder implements SmoothCheckBox.OnCheckedChangeListener { SmoothCheckBox taskBox; TextView recipeComponentName; RecipeTaskHolder(View v) { super(v); taskBox = (SmoothCheckBox) v.findViewById(R.id.recipe_task_box); recipeComponentName = (TextView) v.findViewById(R.id.recipe_component_name); taskBox.setOnCheckedChangeListener(this); } void bindView(String task) { recipeComponentName.setText(task); } @Override public void onCheckedChanged(SmoothCheckBox smoothCheckBox, boolean b) { if (smoothCheckBox.isChecked()) { recipeComponentName.setTextColor(mBrownColor); mCheckItems++; } else { recipeComponentName.setTextColor(mGreenColor); mCheckItems--; } if (mCheckItems == getItemCount()) { //Toast.makeText(mContext, "All items are checked", Toast.LENGTH_SHORT).show(); mCheckedCallback.onAllItemChecked(true); } else { mCheckedCallback.onAllItemChecked(false); } } } interface ItemsCheckedCallback { void onAllItemChecked(boolean status); } } 

任何想法或建议将不胜感激。

在onBindView上使用以下逻辑:

 holder.attenCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if (holder.attenCheckBox.isChecked()) dataModel.setChecked(true); else dataModel.setChecked(false); } }); if (dataModel.getChecked()) holder.attenCheckBox.setChecked(true); else holder.attenCheckBox.setChecked(false); holder.checkboxLinearLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (holder.attenCheckBox.isChecked()) holder.attenCheckBox.setChecked(false); else holder.attenCheckBox.setChecked(true); } }); 

说明:

  • 向下或向上滚动时,回收视图会增加eveytime。
  • 您需要在数据pojo中存储一个标志以跟踪检查状态
  • 使用setOnCheckedChangeListener那个标志将使你能够检查enable/disable 。确保你在监听器之后放置标志。
 @Override public void onBindViewHolder(MyViewHolder holder,final int position) { final ClassName object = objectList.get(position); object.checkBox.setOnCheckedChangeListener(null); object.checkBox.setChecked(false); object.checkBox.setOnCheckedChangeListener(new android.widget.CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { object.setChecked(isChecked); } }); } 

这会持续地绑定视图并保持您的检查位置,并在视图绑定时一次又一次地检查它们。

希望这对你有所帮助。