【问题标题】:Android RecyclerView Checkbox randomly checksAndroid RecyclerView Checkbox 随机检查
【发布时间】:2016-03-18 01:05:58
【问题描述】:

我有一个RecyclerView,它在CardViews 上加载CheckBoxes。这是适配器。加载时很好。但是当我故意在RecyclerView 上检查一个项目时,CheckBox 会在某处随机检查。我怎样才能摆脱这个问题?这是我的适配器。提前致谢。

public class QuestionsAdapter extends RecyclerView.Adapter<QuestionsAdapter.QuestionsViewHolder> {
    List<QuestionModel> Questions;
    public Context context;

    public QuestionsAdapter(Context context, List<QuestionModel> questions) {
        this.Questions = questions;
        this.context = context;
    }

    @Override
    public QuestionsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.questions_card_view, parent, false);
        return new QuestionsViewHolder(v);
    }

    @Override
    public void onBindViewHolder(QuestionsViewHolder holder, final int position) {
        holder.txtQuestionText.setText(Questions.get(position).QuestionText);
    }

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

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public class QuestionsViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public RadioButton rbLike;
        public RadioButton rbdisLike;
        public RadioButton rbnoComment;
        public TextView txtQuestionText;

        public QuestionsViewHolder(View itemView) {
            super(itemView);
            rbLike = (RadioButton) itemView.findViewById(R.id.like);
            rbdisLike = (RadioButton) itemView.findViewById(R.id.Dislike);
            txtQuestionText = (TextView) itemView.findViewById(R.id.txtCardQuestion);
            rbnoComment = (RadioButton) itemView.findViewById(R.id.NoComment);
            rbnoComment.setOnClickListener(this);
            rbdisLike.setOnClickListener(this);
            rbLike.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.like:
                    rbLike.setChecked(true);
                    rbnoComment.setChecked(false);
                    rbdisLike.setChecked(false);

                    break;
                case R.id.Dislike:
                    rbdisLike.setChecked(true);
                    rbnoComment.setChecked(false);
                    rbLike.setChecked(false);
                    break;
                case R.id.NoComment:
                    rbnoComment.setChecked(true);
                    rbLike.setChecked(false);
                    rbdisLike.setChecked(false);
                    //do something
                    break;

                default:
            }
        }
    }
}

【问题讨论】:

  • 您唯一需要更改的是默认情况。你必须在默认情况下添加逻辑,因为你会因为视图的回收而遇到这种问题。

标签: android checkbox android-recyclerview


【解决方案1】:

就我而言,我有如下代码:

if (checkpoint.getIsAttendance() == 1) { 
    holder.checkBoxAttendance.setChecked(true);
}

它发生了,复选框随机检查。

在我更改如下代码之后

if (checkpoint.getIsAttendance() == 1) { 
    holder.checkBoxAttendance.setChecked(true);
} else { 
    holder.checkBoxAttendance.setChecked(false);
}

随机选中的复选框消失。

【讨论】:

    【解决方案2】:

    只需在您的adapter class 中添加以下override 方法:

    我遇到了同样的问题,它对我有用:

       @Override
        public int getItemViewType(int position) {
            return position;
        } 
    

    【讨论】:

      【解决方案3】:
      if (itemChecked[position])
                  holder.ck1.setChecked(true);
              else
                  holder.ck1.setChecked(false);
      
          holder.ck1.setOnClickListener(new OnClickListener() {
              @Override
              public void onClick(View v) {
                  // TODO Auto-generated method stub
                  if (holder.ck1.isChecked())
                      itemChecked[position] = true;
                  else
                      itemChecked[position] = false;
              }
          });
      
          return convertView;
      

      ........

      @Override
      public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
          // TODO Auto-generated method stub
          CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);
          TextView tv = (TextView) v.findViewById(R.id.textView1);
          pi = (PackageInfo) arg0.getItemAtPosition(position);
          cb.performClick();
          if (cb.isChecked()) {
              checkedValue.add(tv.getText().toString());
          } else if (!cb.isChecked()) {
              checkedValue.remove(tv.getText().toString());
          }
      }
      

      【讨论】:

        【解决方案4】:

        你的 onBindViewHolder() 方法有问题... RecyclerView 将在滚动期间重用 ViewHolders。因此,您应该为 ViewHolder 中的所有视图设置状态以查看一致的数据。现在您只为“txtQuestionText”设置文本。在这种情况下,您将看到列表项的一致文本和 RadioButtons 的随机状态。

        简而言之,你应该有这样的东西:

        @Override
        public void onBindViewHolder(QuestionsViewHolder holder, final int position) {
            holder.setModel(Questions.get(position));
        }
        
        ...
        
        public class QuestionsViewHolder ...
        ...
        public void setModel(QuestionModel model){
            rbLike.setChecked(model.like);
            rbdisLike.setChecked(model.dislike);
            rbnoComment.setChecked(model.comment);
            txtQuestionText.setText(model.text);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-08
          • 1970-01-01
          • 2016-03-25
          • 1970-01-01
          • 2015-12-02
          • 2019-10-04
          • 2017-12-31
          相关资源
          最近更新 更多