Android RadioGroup单选按钮更改ArrayAdapter列表视图中的状态
我强调了在滚动浏览问题时,如何在listView中找到维护组中单选按钮状态的正确解决方案。当我选择一个单选按钮并滚动列表时,单选按钮被随机选择Android RadioGroup单选按钮更改ArrayAdapter列表视图中的状态,android,listview,radio-button,android-arrayadapter,radio-group,Android,Listview,Radio Button,Android Arrayadapter,Radio Group,我强调了在滚动浏览问题时,如何在listView中找到维护组中单选按钮状态的正确解决方案。当我选择一个单选按钮并滚动列表时,单选按钮被随机选择 public class QuizAdapter extends ArrayAdapter<Questions>{ public QuizAdapter(Context context, ArrayList<Questions> QuestionList){
public class QuizAdapter extends ArrayAdapter<Questions>{
public QuizAdapter(Context context, ArrayList<Questions> QuestionList){
super(context,0,QuestionList);
}
@NonNull
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View QuesView = convertView;
if(QuesView == null){
QuesView = LayoutInflater.from(getContext()).inflate(R.layout.listlayout,parent,false);
}
final Questions tempQues = getItem(position);
TextView question = (TextView) QuesView.findViewById(R.id.ques);
TextView opt1 = (TextView) QuesView.findViewById(R.id.opt1);
TextView opt2 = (TextView) QuesView.findViewById(R.id.opt2);
TextView opt3 = (TextView) QuesView.findViewById(R.id.opt3);
TextView opt4 = (TextView) QuesView.findViewById(R.id.opt4);;
RadioGroup rg = (RadioGroup) QuesView.findViewById(R.id.rg);
question.setText(tempQues.getQuestion());
opt1.setText(tempQues.getOpt1());
opt2.setText(tempQues.getOpt2());
opt3.setText(tempQues.getOpt3());
opt4.setText(tempQues.getOpt4());
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
int radioButtonID = group.getCheckedRadioButtonId();
RadioButton radioButton = (RadioButton) group.findViewById(radioButtonID);
Questions question = getItem(position);
//for checking current answer and correct answer
Log.v("QuizAdapter",radioButton.getText().toString()+" "+question.getAns());
notifyDataSetChanged();
}
});
return QuesView;
}}
电脑问答课
公共类计算机问答活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u computer\u Quike);
ArrayList computerQuestionsList=新的ArrayList();
ComputerQuestions列表。添加(新问题(“您应该从”、“病毒”、“定时炸弹”、“蠕虫”中保存您的计算机)”+
“上述全部”、“上述全部”);
计算机问题列表。添加(新问题(“转换绘图、打印文本或其他内容的光敏设备”)+
"数码影像是","键盘,"扫描器,"MRE,"鼠标,"扫描器",;
计算机问题列表。添加(新问题(“计算机的基本架构由”“约翰·冯·诺依曼”,
“查尔斯·巴贝奇”、“布莱斯·帕斯卡”、“花园摩尔”、“约翰·冯·诺依曼”);
计算机问题列表。添加(新问题(“一台计算机可以被分类多少代?”),
"3","4","5","6","5"));
计算机问题列表。添加(新问题(“第五代计算机基于”,
“程序智能”、“系统知识”、“全息图”、“人工智能”、“人工智能”);
QuizAdapter ComQuestionList=新的QuizAdapter(这是计算机问题列表);
最终ListView comList=(ListView)findViewById(R.id.comList);
comList.setAdapter(ComQuestionList);
View footer=LayoutInflater.from(getBaseContext()).flate(R.layout.footer_按钮,null,false);
comList.addFooterView(页脚);
}
}
此问题主要是由于适配器对象的重用
因此,您应该做的是,您应该以某种方式存储所选项目,并且当它在视图中调用getView
方法时,您应该检查并更新它
示例:如果您选择第二个问题作为B,并且在屏幕上只有5个问题和答案。当您滚动更多时,适配器将尝试重用旧对象,可能是您的第8个问题将尝试重用您的第2个问题的对象,该问题已回答
对于您的情况:
当用户选择问题时,您可以在
适配器中创建一个HashMap
,您可以更新HashMap
。在getView
中,检查每个问题是否已经存在,然后将单选按钮设置为选中,其他按钮设置为未选中。感谢您的回答,但您能举个例子吗?
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="20dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Question?"
android:id="@+id/ques"
android:textStyle="bold"
android:textAppearance="?android:textAppearanceMedium"/>
<RadioGroup
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingTop="8dp"
android:id="@+id/rg">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="option 1"
android:id="@+id/opt1" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="option 2"
android:id="@+id/opt2" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="option 3"
android:id="@+id/opt3" />
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="option 4"
android:id="@+id/opt4" />
</RadioGroup>
</LinearLayout>
public class Questions {
private String question;
private String opt1;
private String opt2;
private String opt3;
private String opt4;
private String ans;
public Questions(String question, String opt1, String opt2, String opt3, String opt4, String ans) {
this.question = question;
this.opt1 = opt1;
this.opt2 = opt2;
this.opt3 = opt3;
this.opt4 = opt4;
this.ans = ans;
}
public String getQuestion() {
return question;
}
public String getOpt1() {
return opt1;
}
public String getOpt2() {
return opt2;
}
public String getOpt3() {
return opt3;
}
public String getOpt4() {
return opt4;
}
public String getAns() {
return ans;
}
}
public class ComputerQuiz extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_computer_quiz);
ArrayList<Questions> computerQuestionsList = new ArrayList<>();
computerQuestionsList.add(new Questions("You should save your computer from","Viruses","Time bombs","Worms", "" +
"All of the above","All of the above"));
computerQuestionsList.add(new Questions("A light sensitive device that converts drawing, printed text or other " +
"images into digital form is","Keyboard","Scanner","MRE","Mouse","Scanner"));
computerQuestionsList.add(new Questions("The basic architecture of computer was developed by","John Von Neumann",
"Charles Babbage","Blaise Pascal","Garden Moore","John Von Neumann"));
computerQuestionsList.add(new Questions("In how many generations a computer can be classified?",
"3","4","5","6","5"));
computerQuestionsList.add(new Questions("Fifth generation computers are based on",
"Programming Intelligence","System Knowledge","Holograms","Artificial Intelligence","Artificial Intelligence"));
QuizAdapter ComQuestionList = new QuizAdapter(this,computerQuestionsList);
final ListView comList = (ListView) findViewById(R.id.comList);
comList.setAdapter(ComQuestionList);
View footer = LayoutInflater.from(getBaseContext()).inflate(R.layout.footer_button,null,false);
comList.addFooterView(footer);
}
}