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); 
} 
+0

OnClick事件里面的问题是一样的最后一个问题:Q = ...;在开始时。我现在已经重新命名以清楚说明。它可能仍然是一个问题? – vanneto 2012-03-05 21:52:07