首页 > 解决方案 > 带有列表视图的视图持有者单选按钮

问题描述

我正在尝试使用列表视图自定义适配器开发一个测验应用程序,但是当我选择一个单选按钮并向下滚动时,我看到另一个单选按钮被自动选中,我使用视图持有者,我不知道如何解决这个问题。

这是我的视频。

我的自定义适配器的代码。

问题适配器

public class QuestionAdapter2 extends ArrayAdapter<Question> {

    Context context;
    ArrayList<Question> questionArrayList;

    public QuestionAdapter2(Context context, ArrayList<Question> questionArrayList) {
        super(context, R.layout.question_listitem, questionArrayList);
        this.context = context;
        this.questionArrayList = questionArrayList;

    }

    static class ViewHolder {
        protected TextView question;
        protected RadioButton choice1;
        protected RadioButton choice2;
        protected RadioButton choice3;
        protected RadioButton choice4;
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        ViewHolder viewHolder = null;

        if(convertView == null)
        {
            LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=inflater.inflate(R.layout.question_listitem,parent,false);

            viewHolder = new ViewHolder();

            viewHolder.question = convertView.findViewById(R.id.question);
            viewHolder.choice1 = convertView.findViewById(R.id.choice1);
            viewHolder.choice2 = convertView.findViewById(R.id.choice2);
            viewHolder.choice3 = convertView.findViewById(R.id.choice3);
            viewHolder.choice4 = convertView.findViewById(R.id.choice4);

            viewHolder.choice1.setSelected(false);
            viewHolder.choice2.setSelected(false);
            viewHolder.choice3.setSelected(false);
            viewHolder.choice4.setSelected(false);


            convertView.setTag(viewHolder);
        }

        else
        {
            viewHolder = (ViewHolder) convertView.getTag();
        }


        viewHolder.choice1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                questionArrayList.get(position).setChoice1Selected(true);
                questionArrayList.get(position).setChoice2Selected(false);
                questionArrayList.get(position).setChoice3Selected(false);
                questionArrayList.get(position).setChoice4Selected(false);
                Toast.makeText(context, ""+Integer.toString(position), Toast.LENGTH_SHORT).show();
            }
        });

        viewHolder.choice2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                questionArrayList.get(position).setChoice1Selected(false);
                questionArrayList.get(position).setChoice2Selected(true);
                questionArrayList.get(position).setChoice3Selected(false);
                questionArrayList.get(position).setChoice4Selected(false);
                Toast.makeText(context, ""+Integer.toString(position), Toast.LENGTH_SHORT).show();
            }
        });

        viewHolder.choice3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                questionArrayList.get(position).setChoice1Selected(false);
                questionArrayList.get(position).setChoice2Selected(false);
                questionArrayList.get(position).setChoice3Selected(true);
                questionArrayList.get(position).setChoice4Selected(false);
                Toast.makeText(context, ""+Integer.toString(position), Toast.LENGTH_SHORT).show();
            }
        });

        viewHolder.choice4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                questionArrayList.get(position).setChoice1Selected(false);
                questionArrayList.get(position).setChoice2Selected(false);
                questionArrayList.get(position).setChoice3Selected(false);
                questionArrayList.get(position).setChoice4Selected(true);
                Toast.makeText(context, ""+Integer.toString(position), Toast.LENGTH_SHORT).show();
            }
        });

        viewHolder.question.setText(questionArrayList.get(position).getQuestion().toString());
        viewHolder.choice1.setText(questionArrayList.get(position).getCoice1().toString());
        viewHolder.choice2.setText(questionArrayList.get(position).getCoice2().toString());
        viewHolder.choice3.setText(questionArrayList.get(position).getCoice3().toString());
        viewHolder.choice4.setText(questionArrayList.get(position).getCoice4().toString());


        viewHolder.choice1.setSelected(questionArrayList.get(position).getChoice1Selected());
        viewHolder.choice2.setSelected(questionArrayList.get(position).getChoice2Selected());
        viewHolder.choice3.setSelected(questionArrayList.get(position).getChoice3Selected());
        viewHolder.choice4.setSelected(questionArrayList.get(position).getChoice4Selected());

        return convertView;

    }
}

这是我的 xml 文件。

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/question"
        android:text="Question"
        android:textSize="30sp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <RadioGroup
        android:id="@+id/radioGroup"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <RadioButton
            android:id="@+id/choice1"
            android:text="choice1"
            android:textSize="18sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/choice2"
            android:text="choice2"
            android:textSize="18sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/choice3"
            android:text="choice3"
            android:textSize="18sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/choice4"
            android:text="choice4"
            android:textSize="18sp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </RadioGroup>



</LinearLayout>

标签: javaandroidxmlcustom-adapter

解决方案


尝试在您的适配器中使用 if else ,如下所示为每个单选按钮

 if(questionArrayList.get(position).getChoice1Selected())
 {  
viewHolder.choice1.setSelected(true);
  }else{  
viewHolder.choice1.setSelected(false);
 }      

推荐阅读