现在我使用RecyclerView和CheckBox。我的目标是选中复选框列表。这里我的问题是当我尝试选择任何一个Checkbox意味着它同时选择两个Checkbox。例如,我在第0个位置选中Checkbox,但它会自动选择第0个和第13个两个位置Checkbox都被选中。
滚动时没有重复项添加,请清楚了解..
在这里,我必须附上我的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);
你好@Raja这是由于recyclerview的行为。我遇到了同样的问题,所以对于解决方案我将复选框状态存储在我的模型中
public boolean status = false;
默认情况下,onclicklistener会更新列表视图中的状态,这将解决您的问题。
@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);
}
});
}
比它完美地为我工作..
你能否修改下面的函数,我相信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);
}
}
这主要发生是因为recyclerview回收/重用已经创建的项目视图以减少资源消耗。
可以有两种方法来处理这个问题:
试试这个在你的模型中使用一个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);
}
}
});