问题:一次选中两个复选框,同时选择RecyclerView Adapter中的任何复选框

问题描述 投票:-3回答:4

现在我使用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);
android checkbox android-recyclerview recyclerview-layout
4个回答
2
投票

你好@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);
        }
    });
}

比它完美地为我工作..


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

1
投票

这主要发生是因为recyclerview回收/重用已经创建的项目视图以减少资源消耗。

可以有两种方法来处理这个问题:

  1. 在ModuleViewModel模型类中添加一个布尔变量isChecked,并为每个列表项设置为true / false。在这种方法中,checked的值将保存为类本身中的每个模型类。
  2. 创建一个布尔的arraylist isChecked相同大小的项目。 isChecked arraylist的每个元素将对应于recyclerview列表的每个项目。然后,您可以将该位置的isChecked值引用到setChecked(true / false)您的复选框。

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);
                    }
            }
        });
© www.soinside.com 2019 - 2024. All rights reserved.