Android RecyclerView复选框随机检查

Android RecyclerView复选框随机检查,android,checkbox,android-recyclerview,Android,Checkbox,Android Recyclerview,我有一个回收视图,它在卡片视图上加载复选框。这是适配器。当它装载时是好的。但是,当我故意在RecyclerView上选中一个项目时,会在某个地方随机选中一个复选框。我怎样才能解决这个问题?这是我的适配器。提前谢谢 public class QuestionsAdapter extends RecyclerView.Adapter<QuestionsAdapter.QuestionsViewHolder> { List<QuestionModel> Question

我有一个
回收视图
,它在
卡片视图上加载
复选框
。这是适配器。当它装载时是好的。但是,当我故意在
RecyclerView
上选中一个项目时,会在某个地方随机选中一个
复选框。我怎样才能解决这个问题?这是我的适配器。提前谢谢

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:
            }
        }
    }
}
公共类问题适配器扩展了RecyclerView.Adapter{
列出问题;
公共语境;
公共问题回答器(上下文、问题列表){
这个。问题=问题;
this.context=上下文;
}
@凌驾
公共问题viewholder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.questions\u card\u视图,parent,false);
返回新问题查看者(v);
}
@凌驾
BindViewHolder上的公共无效(问题视图持有人,最终int位置){
holder.txtQuestionText.setText(Questions.get(position.QuestionText));
}
@凌驾
public int getItemCount(){
返回问题。size();
}
@凌驾
附加ToRecyclerView(RecyclerView RecyclerView)上的公共无效{
super.onAttachedToRecyclerView(recyclerView);
}
公共类问题ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
公共无线按钮;
公共无线按钮;
公共单选按钮rbnoComment;
公共文本查看txtQuestionText;
公共问题查看文件夹(查看项目视图){
超级(项目视图);
rbLike=(RadioButton)itemView.findViewById(R.id.like);
rbdisLike=(单选按钮)itemView.findViewById(R.id.Dislike);
txtQuestionText=(TextView)itemView.findViewById(R.id.txtCardQuestion);
rbnoComment=(RadioButton)itemView.findViewById(R.id.NoComment);
rbnoComment.setOnClickListener(this);
rblake.setOnClickListener(此);
rbLike.setOnClickListener(this);
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.like:
rbLike.setChecked(true);
rbnoComment.setChecked(false);
rbf.setChecked(false);
打破
案例R.id.1:
rbf.setChecked(true);
rbnoComment.setChecked(false);
rbLike.setChecked(false);
打破
案例R.id.NoComment:
rbnoComment.setChecked(true);
rbLike.setChecked(false);
rbf.setChecked(false);
//做点什么
打破
违约:
}
}
}
}

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

简言之,您应该有如下内容:

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

@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());
    }
}
@覆盖
public void onItemClick(AdapterView arg0,视图v,内部位置,长arg3){
//TODO自动生成的方法存根
复选框cb=(复选框)v.findViewById(R.id.checkBox1);
TextView tv=(TextView)v.findViewById(R.id.textView1);
pi=(PackageInfo)arg0.getItemAtPosition(位置);
cb.performClick();
if(cb.isChecked()){
checkedValue.add(tv.getText().toString());
}如果(!cb.isChecked()){
checkedValue.remove(tv.getText().toString());
}
}

只需在
适配器类中添加以下
重写
方法即可:

我也遇到了同样的问题,这对我很有效:

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

在我的例子中,我有如下代码:

if (checkpoint.getIsAttendance() == 1) { 
    holder.checkBoxAttendance.setChecked(true);
}
当它发生时,复选框被随机选中

在我修改了下面的代码之后

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

出现随机复选框。

您只需更改默认情况。您必须在默认情况下添加逻辑,因为视图的循环使用将导致此类问题。
if (checkpoint.getIsAttendance() == 1) { 
    holder.checkBoxAttendance.setChecked(true);
} else { 
    holder.checkBoxAttendance.setChecked(false);
}