Nowicjusz. Koduję aplikację do quizów pełny kod na Github, który ładuje arrayList z czterema argumentami :

  1. pytanie
  2. obraz (z rysunków)
  3. kluczowa odpowiedź
  4. możliwe odpowiedzi przedstawione w radioGroup (sub-arrayList)

Z strings.xml, jak poniżej

    ...
    <string name="questionOne">Who is the "Modern Love" rock star singer?</string>
    <string name="answerOne">David Bowie</string>

    <string-array name="celebrityOne">
        <item>Jaimie Hendrix</item>
        <item>David Bowie</item>
        <item>Jim Morrison</item>
        <item>Elvis Presley</item>
    </string-array>
    ...

Poniżej znajduje się sposób ładowania argumentów w MainActivity (trzeci argument to sub-tablica)

    ArrayList<Object> arrayList = new ArrayList<>();
    loaddata()

    ...

    public void loadData() {
        arrayList.add(new Quiz(getResources().getString(R.string.questionOne), 
                getResources().getDrawable(R.drawable.celebrity_one_image, null), 
                new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.celebrityOne))),
                getResources().getString(R.string.answerOne)));   

        arrayList.add(new Quiz(getResources().getString(R.string.questionTwo), 
                getResources().getDrawable(R.drawable.celebrity_two_image, null), 
                new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.celebrityTwo))),
                getResources().getString(R.string.answerTwo)));

        ...  

    }

Problem polega na tym, że po N iteracjach sub-arrayList zaczyna się powtarzać (patrz ilustracja poniżej).

Myślę też, że może źródło problemu tkwi w adapterze, gdzie dla każdego ciągu w podtablicy jest przypisany do radioButton;


      void createRadioButtons(String[] arrayAnswer) {
            if (mRadioGroup.getChildAt(0) != null)
                return;
            for (int i = 0; i < arrayAnswer.length; i++) {
                mRadioGroup.addView(createRadioButtonAnswerAndSetOnClickListener(arrayAnswer[i]));
            }
        }

        RadioButton createRadioButtonAnswerAndSetOnClickListener(String string) {
            RadioButton radioButton = new RadioButton(mContext);
            radioButton.setText(string);
            radioButton.setOnClickListener(this);
            return radioButton;
        }

First Image Second image

Moja sytuacja może być podobna do this, ale nie mam pól statycznych, a arrayList jest inicjalizowana jako nowa, więc nie ma potrzeby clear().

0
axelmukwena 21 marzec 2020, 17:39

2 odpowiedzi

Najlepsza odpowiedź

W swoim adapterze po prostu zmień to:

  if (mRadioGroup.getChildAt(0) != null)
            return;

Do tego:

if (mRadioGroup.getChildAt(0) != null)
            mRadioGroup.removeAllViews();

W pewnym momencie twój adapter zaczął ponownie używać uchwytów widoków, które zostały utworzone na górze recyclinglerView, ale był już wypełniony danymi, więc kiedy wywołujesz return, po prostu zostawiasz swoje stare dane, podczas gdy musisz je usunąć, a następnie dodaj nowe dane ...

1
Alexander Gapanowich 21 marzec 2020, 15:21

Z Dokumentacji:

RecyclerView tworzy tylko tylu posiadaczy widoku, ilu potrzeba do wyświetlenia części dynamicznej na ekranie, plus kilka dodatkowych. Gdy użytkownik przewija listę, RecyclerView przejmuje widoki pozaekranowe i ponownie wiąże je z danymi, które są przewijane na ekranie.

Oznacza to, że RecyclerView ponownie wykorzystuje już utworzone uchwyty widoków podczas ich przewijania (dlatego Twoje dane się powtarzają) i musisz ponownie wypełnić widoki nowymi danymi. Więc zamiast wracać z metody createRadioButtons, kiedy mRadioGroup.getChildAt(0) != null, musisz zmienić RadioButtons teksty na nowe dane z arrayAnswer.

2
Garnik 21 marzec 2020, 15:09