Android - PagerAdapter не сохраняет состояние RadioButton - PullRequest
0 голосов
/ 06 марта 2012

У меня очень специфическая проблема.Я понимаю, что хотя на переднем плане переменные-члены Activity остаются нетронутыми (не нужно сохранять для сохранения).Теперь у меня есть PagerAdapter, который представляет собой тест с вопросом и тремя ответами.Я создал различные объекты для представления вопроса и ответов.

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 для сохранения памяти, уничтожив, таким образом, RadioButton, поэтому у меня есть этот фрагмент:

if (a.isSelected()) rb.setChecked(true);

Но это все еще происходит.Я пытался записать все, отладки, но я не могу найти источник проблемы.Может быть, кто-то здесь сталкивался с подобной проблемой.

Любая помощь приветствуется, Спасибо заранее!

1 Ответ

2 голосов
/ 06 марта 2012

В событии OnClick убедитесь, что ваша ссылка на Вопрос является правильным объектом. Возможно, вы захотите сослаться на вопрос по индексу списка, потому что, если у вас есть два вопроса на экране одновременно, ссылка 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);
 }
...