java - 带有列表视图的视图持有者单选按钮
问题描述
我正在尝试使用列表视图自定义适配器开发一个测验应用程序,但是当我选择一个单选按钮并向下滚动时,我看到另一个单选按钮被自动选中,我使用视图持有者,我不知道如何解决这个问题。
我的自定义适配器的代码。
问题适配器
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>
解决方案
尝试在您的适配器中使用 if else ,如下所示为每个单选按钮
if(questionArrayList.get(position).getChoice1Selected())
{
viewHolder.choice1.setSelected(true);
}else{
viewHolder.choice1.setSelected(false);
}
推荐阅读
- elasticsearch - 使用动态模板索引 geo_point 时,Elastic 可以忽略大小写吗?
- python - 使用 SODA api 和 python 获取模式
- numba - 无法在 numba 中将 ListType[tuple(float64 x 2)] 转换为 list(tuple(float64 x 2))
- qt - 如何在 QtQuick 中对齐 ListView 中的项目
- angular - 更新可观察对象后,如何通过更新 ngModel 来从 ngrx 为 ngModel 赋值?
- html - Ionic 中的选框效果
- javascript - 无法调用 JSON 对象的第一个元素
- vba - 基于文本输入汇总摘要任务
- html - 标题内容对齐/定位
- c++11 - 对于指向 std::set 容器中用户定义类的指针,自定义比较类无法正常工作