Android - PagerAdapter不保存RadioButton的状态

时间:2012-03-05 21:36:35

标签: android android-widget android-viewpager

我有一个非常奇怪的问题。我理解,在前台,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);

但它仍在发生。我已经尝试记录所有内容,调试但我似乎无法找到问题的根源。也许这里有人遇到过类似的问题。

感谢任何帮助, 提前谢谢!

1 个答案:

答案 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);
 }