Android RecyclerView Checkbox randomly checks

筅森魡賤 提交于 2019-12-07 05:24:07

问题


I have a recyclerview which loads checkboxes on cardviews. This is the adapter. It is fine when it loads. But when I check an item on recyclerview intentionally, a checkbox is checked somewhere random. How can I get rid of this problem? Here is my adapter. Thanks in advance.

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:
        }
    }

}

}


回答1:


There is a problem in your onBindViewHolder() method... RecyclerView going to reuse ViewHolders during scrolling. For that reason you should set state for all views in the ViewHolder to see consistent data. Now you set only text for "txtQuestionText". In this case you will see consistent text for the list item and random state for the RadioButtons.

In brief you should have something like this:

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



回答2:


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



回答3:


Just add following override method in your adapter class:

I was having the same issue, it worked for me:

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


来源:https://stackoverflow.com/questions/34235049/android-recyclerview-checkbox-randomly-checks

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!