Android - PagerAdapter没有保存RadioButton的状态
问题描述:
我有一个非常奇怪的问题。我明白,在前台时,Activity的成员变量保持不变(不需要保存就可以保持)。现在,我有一个PagerAdapter
代表一个问题和三个答案的测验。我已经制作了各种对象来表示问题和答案。Android - PagerAdapter没有保存RadioButton的状态
A Question
总是有一个确切的3 Answer
的列表。这就是我要做的事:(注意:一些代码被排除在外的可读性)
public class QuizPagerAdapter
{
List<Question> questionList;
Context context;
public QuizPagerAdapter (List<Question> list, Context ctx) {
questionList = list;
context = ctx;
}
@Override
public Object instantiateItem (View pager, int position) {
// Create various views (ScrollView, LinearLayout, etc)
final Question q = questionList.get(position);
RadioGroup group = new RadioGroup(context);
for (int i = 0; i < 3; i++) {
Answer a = q.getAnswer(i);
RadioButton rb = new RadioButton(context);
rb.setId(i);
rb.setText(a.getText());
rb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RadioButton btn = (RadioButton) v;
q.unselectAll(); // unselects all Answer's
q.getAnswer(btn.getId()).setSelected(true);
}
});
if (a.isSelected()) rb.setChecked(true);
}
return view;
}
}
当我在活动中使用,我得到的问题的一个很好的名单有三个答案。现在,当我选择一个答案时,RadioButton被选中。好的,现在,我滚动到下一个问题并检查一个问题,然后回到上一个问题,那里我首先检查的答案现在是而不是检查。
现在,这并不总是发生,有时会发生,但有时足以导致问题。该活动从不放置在后台。
据我所知,Android将破坏在PagerAdapter视图来节省内存,从而破坏了单选按钮,这就是为什么我有这样的片段:
if (a.isSelected()) rb.setChecked(true);
但它仍然发生。我试过记录所有的东西,调试,但我似乎无法找到问题的根源。也许这里有人遇到类似的问题。
任何帮助表示赞赏, 先谢谢您!
答
在OnClick事件中,确保您对问题的引用是正确的对象。您可能想要通过列表索引来引用问题,因为如果同时在屏幕上有两个问题,则q的引用可能是第二个问题,但是您已经单击了第一个问题答案。
**已添加** 问题是q是对问题的引用,并且每次通过instantiateItem函数将此引用设置为列表中问题的新实例。因此,当您执行OnClick事件时,值q可能指向问题的不正确实例,而不是您期望的。您最好将问题从活动中的views索引中移出原始列表。
类似以下内容:
public void onClick(View v) {
RadioButton btn = (RadioButton) v;
Question question = questionList.get(position);
question.unselectAll(); // unselects all Answer's
question.getAnswer(btn.getId()).setSelected(true);
}
OnClick事件里面的问题是一样的最后一个问题:Q = ...;在开始时。我现在已经重新命名以清楚说明。它可能仍然是一个问题? – vanneto 2012-03-05 21:52:07