安卓RecyclerView复选框随机选中

5

我有一个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:
            }
        }
    }
}

你需要改变的唯一一件事就是默认情况。你必须在默认情况下添加逻辑,因为你会遇到这种由于视图的回收而导致的问题。 - FacuArg
4个回答

5

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

简而言之,您应该像这样做:

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

1
在我的情况下,我有以下类似这样的代码:

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

发生了这种情况,复选框会随机被选中。

在我修改了以下代码后:

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

随机选择的复选框消失了。

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

-1

只需在您的适配器类中添加以下override方法:

我曾经遇到过同样的问题,这对我有用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接