2012-03-05 4 views
0

매우 특이한 문제가 있습니다. 포어 그라운드에서 액티비티의 멤버 변수는 변경되지 않은 채로 유지됩니다 (저장하지 않아도 지속됨). 자, 질문과 3 개의 답이있는 퀴즈를 나타내는 PagerAdapter이 있습니다. 질문과 답변을 표현하기 위해 다양한 객체를 만들었습니다.Android - PagerAdapter가 RadioButton의 상태를 저장하지 않음

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이 선택됩니다. 좋아, 이제 다음 질문으로 스크롤하여 그 질문을 확인한 다음 이전 질문으로 돌아가서 처음에 확인한 대답이 이 아니며이 확인되었습니다.

이제 항상 그런 것은 아니지만 때로는 발생하지만 때로는 문제가 발생할 수 있습니다. 활동이 배경에 배치되지 않습니다.

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

그러나 여전히 일어나고있다 :

내가 안드로이드 따라서의 RadioButton을 파괴, 메모리를 절약하기 위해 PagerAdapter에서보기를 파괴 할 것이라는 점을 이해하고, 이것이 내가이 조각이있는 이유도 바로이 때문입니다. 모든 것을 로깅 해보았지만 디버깅은했지만 문제의 근원을 알 수는 없습니다. 어쩌면 여기 누군가가 비슷한 문제를 겪었을 것입니다.

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

답변

2

OnClick 이벤트에서 Question에 대한 참조가 올바른 개체인지 확인하십시오. 동시에 화면에 두 개의 질문이있는 경우 q의 참조가 두 번째 질문이 될 수 있지만 첫 번째 질문 대답을 클릭 했으므로 목록 색인을 사용하여 질문을 참조 할 수 있습니다.

** ** added ** 문제점은 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); 
} 
+0

OnClick 이벤트 내부의 질문 마지막 질문과 동일 Q = ...; 처음에는. 나는 그것을 명확하게하기 위해 그것을 지금 바꿨다. 여전히 문제가 될 수 있을까요? – vanneto

관련 문제