簡體   English   中英

Android - PagerAdapter不保存RadioButton的狀態

[英]Android - PagerAdapter not saving RadioButton's state

我有一個非常特殊的問題。 我理解,在前台,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);

但它仍在發生。 我已經嘗試記錄所有內容,調試但我似乎無法找到問題的根源。 也許這里有人遇到過類似的問題。

任何幫助表示贊賞,謝謝!

在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);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM