现在我正在使用RecyclerView和CheckBox。我的目标是选中复选框列表。这里我的问题是当我尝试选择任何一个Checkbox意味着它同时选择两个Checkbox。例如,我在第0个位置选中Checkbox,但它自动选择第0和第13个两个位置复选框都被选中。
滚动时没有重复项目添加,请理解清楚..
在这里,我必须附上我的RecyclerView适配器类。请任何人帮助我..
先谢谢。
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private ArrayList<ModuleViewModel> items = new ArrayList<>();
private OnItemCheckListener onItemClick;
private Context mContext;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.item_modules_list, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
final ModuleViewModel currentItem = items.get(position);
holder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkbox.setChecked(
! holder.checkbox.isChecked());
if ( holder.checkbox.isChecked()) {
onItemClick.onItemChecked(currentItem);
} else {
onItemClick.onItemUnchecked(currentItem);
}
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public interface OnItemCheckListener {
void onItemChecked(ModuleViewModel item);
void onItemUnchecked(ModuleViewModel item);
}
public MyAdapter (Context context,ArrayList<ModuleViewModel> items, @NonNull OnItemCheckListener onItemCheckListener) {
this.mContext = context;
this.items = items;
this.onItemClick = onItemCheckListener;
}
static class MyViewHolder extends RecyclerView.ViewHolder {
CheckBox checkbox;
View itemView;
public MyViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
checkbox = (CheckBox) itemView.findViewById(R.id.uiCkbModule);
checkbox.setClickable(false);
}
public void setOnClickListener(View.OnClickListener onClickListener) {
itemView.setOnClickListener(onClickListener);
}
}
}
这是我的适配器调用代码
mModuleListAdapter = new ModuleListAdapter(mContext, mModuleListModel, this);
mRvModuleView.setAdapter(mModuleListAdapter);
答案 0 :(得分:2)
你好@Raja这是由于recyclerview的行为。我遇到了同样的问题,所以对于解决方案我将复选框状态存储在我的模型中
public boolean status = false;
默认情况下 比onclicklistner更新列表视图中的状态,这将解决您的问题。
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
final Student student = items.get(position);
holder.checkbox.setText(student.name + " :: " + student.department);
holder.checkbox.setChecked(student.status);
holder.checkbox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.checkbox.isChecked()) {
onItemClick.onItemChecked(student);
} else {
onItemClick.onItemUnchecked(student);
}
student.status = holder.checkbox.isChecked();
items.remove(position);
items.add(position, student);
}
});
}
比完全为我工作..
答案 1 :(得分:1)
请你修改下面的函数,我相信ModelViewModel对象会有一些布尔变量来保存复选框的状态。
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
final ModuleViewModel currentItem = items.get(position);
holder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.checkbox.setChecked(! holder.checkbox.isChecked());
if ( holder.checkbox.isChecked()) {
onItemClick.onItemChecked(currentItem);
} else {
onItemClick.onItemUnchecked(currentItem);
}
}
});
if(!currentItem.isChecked) {
holder.checkbox.setChecked(false);
}else {
holder.checkbox.setChecked(true);
}
}
答案 2 :(得分:1)
这主要是因为recyclerview回收/重用已经创建的项目视图以减少资源消耗。
有两种方法可以解决这个问题:
在 ModuleViewModel 模型类中添加布尔变量 isChecked 并为每个列表项设置true / false。在这种方法中,checked的值将为类本身中的每个模型类保存。
创建与 项目 相同大小的布尔 isChecked 的广告词典。 isChecked arraylist的每个元素都对应于recyclerview列表的每个项目。然后,您可以在该位置参考 isChecked 的值,将setChecked(true / false)复选为您的复选框。
答案 3 :(得分:0)
尝试在模型中选择一个boolean
,例如isChecked
,并为boolean
变量创建getter和setter方法
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
items.get(position).isChecked=isChecked;
} else {
items.get(position).isChecked=isChecked;
}
}
});
而不是试试这个
holder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if ( items.get(position).isChecked())) {
onItemClick.onItemChecked(currentItem);
} else {
onItemClick.onItemUnchecked(currentItem);
}
}
});