我有一个非常奇怪的问题。我理解,在前台,Activity的成员变量保持不变(不需要保存以保持)。现在,我有PagerAdapter
代表一个带有问题和三个答案的测验。我已经制作了各种对象来代表问题和答案。
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;
}
}
当我在我的Activity中使用它时,我得到一个很好的问题列表,包含三个答案。现在,当我选择一个答案时,将检查RadioButton。好的,现在,我滚动到下一个问题并检查一个,然后回到上一个问题,我在第一个地方检查的答案现在是不检查。
现在,这并不总是会发生,有时会发生,但有时这足以导致问题。活动永远不会放在后台。
我知道Android会破坏PagerAdapter中的Views以节省内存,从而破坏RadioButton,这就是为什么我有这个片段:
if (a.isSelected()) rb.setChecked(true);
但它仍在发生。我已经尝试记录所有内容,调试但我似乎无法找到问题的根源。也许这里有人遇到过类似的问题。
感谢任何帮助, 提前谢谢!
答案 0 :(得分:2)
在OnClick事件中,确保您对Question的引用是正确的对象。您可能希望通过列表索引引用该问题,因为如果您同时在屏幕上有两个问题,则q的引用可能是第二个问题,但您已单击第一个问题答案。
**已添加** 问题是q是对问题的引用,并且每次通过instantiateItem函数时,此引用都将从列表中设置为问题的新实例。因此,当您执行OnClick事件时,值q可能指向不正确的问题实例,而不是您期望的。您最好通过活动中的视图索引将问题从原始列表中删除。
如下所示:
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);
}