ViewPager, der alte Fragmente bei der Bildschirmdrehung beibehält

ich benutzeViewPager undFragmentStatePagerAdapter Fragment zeigen. Zunächst werden 2 Fragmente Fragment1 und Fragment2 hinzugefügt, und das dritte Fragment Fragment3 wird an der zweiten Position hinzugefügt, nachdem die Antwort vom Server empfangen wurde. Nachdem alle Seiten hinzugefügt wurden, sollte dies eine Sequenz von Fragmenten in ViewPager sein -> Fragment1, Fragment3, Fragment2.

Das Problem besteht darin, dass nach dem Hinzufügen von Fragment1 und Fragment3 die App einen Serveraufruf ausführt, bevor das dritte Fragment an der zweiten Position hinzugefügt wird. Wenn ich den Bildschirm mehrmals drehe, wird nach dem Hinzufügen des dritten Fragments immer noch die alte Kopie von Fragment2 angezeigt, die sich an der zweiten Position befand Position und 3. Position haben eine neue Kopie von Fragment2. Daher wird Fragment3 im ViewPager angezeigt. Sequenz nach dem Hinzufügen des 3. Fragments -> Fragment1, alte Kopie von Fragment2, Neues Fragment2.

Ich übersteuereonSaveInstanceState und anrufensuper.onSaveInstanceState in meiner Aktivität.

Auch ich habe versucht, zurückzukehrenPOSITION_NONE vongetItemPosition. Ich habe irgendwo gelesen, dass ViewPager Kopien von Fragmenten speichert. Auch durch das Debuggen habe ich überprüft, dass ViewPager 2 Kopien von Fragment2 enthielt, als das Problem reproduziert wurde, obwohlgetItem vonFragmentStatePagerAdapter Es wurden verschiedene Fragmente für jede Position zurückgegeben, aber immer noch an der 2. Position wurden alte Fragmente angezeigt. Zu Testzwecken ingetItem Ich habe Fragment1 für alle Positionen zurückgegeben, so dass alle 3 Seiten gleich sein sollten, aber selbst danach zeigte es an der 2. Position eine alte Kopie von Fragment2, als ich das Problem mit den oben genannten Schritten reproduzierte.

Also, wie man klärtViewPager damit es keine alten fragmente rettet. So aktualisieren Sie ViewPager, damit keine alte Kopie mit Fragmenten beibehalten wird. Ich denke, das Problem liegt bei onSaveInstanceState, aber ich brauche es. Wie kann ich ausschließenViewPager wenn Ansichten in gespeichert werdenonSaveInstanceState. Ich habe versuchtmViewPager.setSaveEnabled(false) aber es braucht zu viel Speicher.

Ich fand, dass das Problem istinstantiateItem Die Methode des Adapters ruft getItem nicht auf, aufgrund dessen das alte Fragment zurückgegeben wird.

Unten finden Sie den Lösungscode

Code:

 @Override
        public Object instantiateItem(ViewGroup container, int position) {
            Object obj = super.instantiateItem(container, position);
            Fragment fragment = mFragments.get(position);

            if((obj!=null && fragment!=null) && !(obj.getClass().getSimpleName().equals(fragment.clss.getSimpleName()))){
                destroyItem(container, position, obj);
                return super.instantiateItem(container, position);
            }else{
                return obj;
            }
        }

Antworten auf die Frage(2)

Ihre Antwort auf die Frage