我有一个光标,它检索成分列表并填充适配器,然后将其分配给具有复选框的回收站视图。我得到的问题是,当我检查一组复选框并向下滚动时,从顶部选择的那些,取消选择,反之亦然,或者在某些情况下,如果我从顶部选择三个,三个来自底部被选中。我需要确保,最初没有选择任何内容,即使我上下滚动,选中的内容仍应保持选中状态并需要跟踪。
这是可以scrolable的列表。
这是我的代码:
class RecipeDetailCursorAdapter extends CursorRecyclerViewAdapter<RecyclerView.ViewHolder> {
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);
}
}
任何想法或建议将不胜感激。
答案 0 :(得分:1)
在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);
}
});
说明:
setOnCheckedChangeListener
一起使用,可以让您检查enable/disable
。确保你在听众之后放置旗帜。答案 1 :(得分:0)
RecyclerView在滚动时从布局中删除(回收)看不见的视图,这是recyclerView的基本行为,目的是减少内存使用。
当回收带有复选框的视图时,未选中的复选框将被取消选中,如果它具有侦听器,则会调用该侦听器。
可以在视图回收后将其从视图中删除。只需重写onViewRecycled方法即可。
@Override
public void onViewRecycled(@NonNull MyViewHolder holder) {
holder.checkBox.setOnCheckedChangeListener(null);
super.onViewRecycled(holder);
}
再次构建视图时,在滚动时,还将再次添加您的侦听器。
答案 2 :(得分:-1)
@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);
}
});
}
这会持续地绑定视图并保持您的检查位置,并在视图绑定时一次又一次地检查它们。
希望这会对你有所帮助。