【问题标题】:How to select single checkbox in a recycler view with multiple checkboxes如何在具有多个复选框的回收器视图中选择单个复选框
【发布时间】:2017-09-29 21:06:30
【问题描述】:

有这个问题的答案,但没有一个能解决我的问题。下面是我的代码。

  public class QuizAdapter extends RecyclerView.Adapter<QuizAdapter.MyViewHolder> {
Context context;
private List<Quiz_G_S> quiz_g_sList = null;
int selectedPosition = -1;


public QuizAdapter(Context context, List<Quiz_G_S> list) {
    this.context = context;
    this.quiz_g_sList = list;
}


@Override
public QuizAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.quiz_single_row, parent, false);

    return new MyViewHolder(itemView);

}

@Override
public void onBindViewHolder(final QuizAdapter.MyViewHolder holder, int position) {

    final int pos = position;

    holder.answers.setText(quiz_g_sList.get(pos).getMCQ());

    holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            quiz_g_sList.get(pos).setChecked(true);

        }
    });

    if (quiz_g_sList.get(pos).isChecked()) {
        holder.checkBox.setChecked(true);
        notifyDataSetChanged();

    } else {
        holder.checkBox.setChecked(false);

    }





}


@Override
public int getItemCount() {
    return quiz_g_sList.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {

    TextView answers;
    CheckBox checkBox;

    public MyViewHolder(View v) {
        super(v);

        answers = (TextView) v.findViewById(R.id.quiz_adap_ans);
        checkBox = (CheckBox) v.findViewById(R.id.quiz_adap_check);

    }
}

以上是我的适配器代码。

这是我的 Quiz_G_S 课

public class Quiz_G_S {


String MCQ;
int Rank;
boolean checked;

public boolean isChecked() {
    return checked;
}

public void setChecked(boolean checked) {
    this.checked = checked;
}

public String getMCQ() {
    return MCQ;
}

public void setMCQ(String mcq) {
    this.MCQ = mcq;
}

public int getRank() {
    return Rank;
}

public void setRank(int rank) {
    this.Rank = rank;
}

}

我想要做的是,如果我选中一个复选框,那么所有复选框都将设置为未选中,除了我选中的那个 notifyDataSetChanged 有错误。我猜逻辑是正确的,但我不知道如何刷新复选框状态。我唯一知道的是 notifyDataSetChanged 是否有任何其他方法可以刷新或者是否有解决此问题的方法

【问题讨论】:

    标签: android checkbox android-recyclerview


    【解决方案1】:

    试试下面的代码:

    1. Quiz_G_Sboolean isChecked 中再定义一个对象

    2. 获取选中CheckBox的位置

      selectedPosition = holder.getAdapterPosition();

    3. 重置 List 的所有其他对象,如下所示:

      for (int i=0; i<list.size ; i++) 
      {  
        if (selectedPosition==i)  
           list.get(i).setIsChecked(true); 
        else     
           list.get(i).setIsChecked(false);
      }
      
    4. 致电QuizAdapter.this.notifyDataSetChanged();

    5. 最后,检查选中的复选框,如下所示:

      if (list.get(position).getIsChecked()) 
      {
         holder.checkBox.setChecked(true);
      } else {
        holder.checkBox.setChecked(false);
      }
      

    【讨论】:

      【解决方案2】:

      我已经这样实现了,我得到了输出。

      if(view == null) {
      
              view = inflater.inflate(R.layout.todo_checkbox_adapter_layout, parent, false);
              holder = new ViewHolder();
              holder.todoItemTextView = (TextView) view.findViewById(R.id.item_tv);
              holder.checkedTextView = (CheckBox) view.findViewById(R.id._item_checkbox);
              view.setTag(holder);
          } else {
              holder = (ViewHolder) view.getTag();
          }
          holder.todoItemTextView.setTag("" + position);
          holder.checkedTextView.setChecked(displayModel.isFinished());
      
          holder.checkedTextView.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
              @Override
              public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                  try {
                      String tag = (String) holder.todoItemTextView.getTag();
                      int pos = Integer.parseInt(tag);
                      todoItemBeanList.get(pos).setFinished(isChecked);
                  } catch (NumberFormatException e) {
                      e.printStackTrace();
                  }
              }
          });
      

      【讨论】:

        【解决方案3】:

        代替

         selectedPosition = holder.getAdapterPosition();
        

        在您的对象类中维护一个标志,该标志将在选中特定复选框时设置,假设“选中”是您在对象类中创建的标志,然后

        在检查更改侦听器时将其设置为 true

        if (isChecked) {
            holder.checkBox.setChecked(true);
        
        } else {
            holder.checkBox.setChecked(false);
        
        }
        

        编辑

         if (quiz_g_sList.get(pos).isChecked) {
                holder.checkBox.setChecked(true);
        
            } else {
                holder.checkBox.setChecked(false);
        
            }
        

        更新

        把你的对象类改成这个

         public class Quiz_G_S {
        
                String MCQ;
                int Rank;
                boolean checked;
        
                public boolean isChecked() {
                    return checked;
                }
        
                public void setChecked(boolean checked) {
                    this.checked = checked;
                }
        
                public String getMCQ() {
                    return MCQ;
                }
        
                public void setMCQ(String mcq) {
                    this.MCQ = mcq;
                }
        
                public int getRank() {
                    return Rank;
                }
        
                public void setRank(int rank) {
                    this.Rank = rank;
                }
            }
        

        【讨论】:

        • 但是我将如何刷新复选框的状态?
        • quiz_g_sList.get(pos).setChecked(true) 中的 setChecked (true) 是什么;这是我必须创建的方法吗?
        • 我告诉过你,你需要在你的对象类中创建标志,即 Quiz_G_S
        • 对不起,我没听懂。因为我是安卓新手。你能解释一下吗
        • 你能提供给我你的类名为 Quiz_G_S
        【解决方案4】:

        你要做什么:

        1. 将选中的位置传递给 Activity/Fragment/Presenter (实现 click/checkChanged 监听器)。示例可以在这里找到:RecyclerView onClick
        2. 将选中项的位置保存到变量中(比如int selectedPosition)。
        3. 然后在每次点击/检查时更新之前检查的项目:

        if (position != selectedPosition) { // user selected another item so previous one should be updated adapter.notifyItemChanged(selectedPosition); selectedPosition = position; }

        【讨论】:

          猜你喜欢
          • 2018-04-20
          • 1970-01-01
          • 2015-11-30
          • 1970-01-01
          • 2014-10-07
          • 2018-08-06
          • 2020-03-30
          • 2021-04-11
          • 1970-01-01
          相关资源
          最近更新 更多