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