【问题标题】:Issue: Two checkbox are checked at a time while select any checkbox in RecyclerView Adapter问题:在 RecyclerView 适配器中选择任何复选框时,一次选中两个复选框
【发布时间】:2018-06-10 09:56:49
【问题描述】:

现在我正在使用带有 CheckBox 的 RecyclerView。我的目标是选中复选框列表。这里我的问题是,当我尝试选择任何一个复选框时,意味着它同时选择了两个复选框。例如,我选择了第 0 位复选框,但它自动选择了第 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);

【问题讨论】:

  • 在模型类中使用布尔字段并使用该字段进行选择。
  • @user8,你们明白还是不明白?...我在哪里说滚动时重复项目?那么你如何标记为重复?
  • 我不知道你们投反对票的原因。任何人都可以说出原因。如果您知道解决方案,请给出解决方案。请...

标签: android checkbox android-recyclerview recyclerview-layout


【解决方案1】:

试试这个在你的模型中取一个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);
                    }
            }
        });

【讨论】:

  • this is not a solution Boss你能解释一下为什么
  • 现在我不需要holder.setOnClickListener这部分代码。没有任何监听器,只有我需要的点击事件。
  • 比这个条件怎么样holder.checkbox.setChecked( ! holder.checkbox.isChecked());可以解释更多你想要达到的目标
  • 老板,这一切都不是问题。敬请谅解。谁在不需要的地方使用布尔值。它不是很好的编程。
【解决方案2】:

您能否修改以下函数,我相信 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);
        }
    }

【讨论】:

    【解决方案3】:

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

    有两种方法可以解决这个问题:

    1. 在您的 ModuleViewModel 模型类中添加一个布尔变量 isChecked 并为每个列表项设置为真/假。在这种方法中,checked 的值将保存在类本身的每个模型类中。

    2. 创建与 items 大小相同的布尔值 isChecked 的数组列表。 isChecked arraylist 的每个元素都将对应于recyclerview 列表的每一项。然后,您可以参考该位置的 isChecked 的值来设置您的复选框。

    【讨论】:

      【解决方案4】:

      你好@Raja 这是由于 recyclerview 的行为。我遇到了同样的问题,所以为了解决方案,我将复选框状态存储在我的模型中

      公共布尔状态 = 假;

      默认情况下 比 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);
              }
          });
      }
      

      比它完美地为我工作..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多