Ich habe eine ViewPager
(erweitert FragmentPagerAdapter
) die zwei Fragments
enthält. Was ich brauche ist nur ein ListView
für jedes Fragment
zu aktualisieren, wenn ich zwischen ihnen wische. Dafür habe ich ViewPager.OnPageChangeListener
interface implementiert (nämlich onPageScrollStateChanged
). Um Referenzen auf Fragment
s zu halten, verwende ich HashTable
. Ich speichere Referenzen auf Fragments
in HashTable
in getItem()
Methode:
Also, wenn ich von einem Fragment
zu einem anderen wische, die onPageScrollStateChanged
Trigger, wo ich die HashTable
verwende um die benötigte Methode in Fragments
(refresh) aufzurufen:
Alles geht gut, bis orientation change
event passiert. Danach ist der Code in refresh()
method, was ist:
Ergebnisse in IllegalStateException
:
Unter der Annahme, dass die Content
-Ansicht nicht wirklich erstellt wurde, setzte ich die boolean
Variable in onActivityCreated()
Methode auf true
und verwendete if/else
Bedingung auf getListView()
oder nicht, was die Aktivitäts- und Inhaltsansicht zeigte erfolgreich erstellt.
Dann habe ich debuggt um zu sehen, wenn FragmentPagerAdapter
getItem()
aufruft und es passiert, dass die Methode nicht nach orientation change
event aufgerufen wird. Sieht so aus, als ob ViewPager
Referenzen auf alte Fragments
enthält. Das ist nur meine Annahme.
Also, gibt es eine Möglichkeit, das ViewPager
so zu erzwingen, dass getItem()
erneut aufgerufen wird, damit ich die richtigen Referenzen auf das aktuelle Fragments
verwenden kann? Kann eine andere Lösung sein? Vielen Dank.
Dann habe ich debuggt, um zu sehen, wann FragmentPagerAdapter getItem () aufruft und es passiert, dass die Methode nicht nach dem Ereignis der Orientierungsänderung aufgerufen wird. Es sieht also so aus, als ob ViewPager Verweise auf alte Fragmente enthält.
Die Fragmente sollten automatisch neu erstellt werden, genau wie jedes Fragment bei einer Konfigurationsänderung. Die Ausnahme wäre, wenn Sie setRetainInstance(true)
verwendet hätten. In diesem Fall sollten sie dieselben Fragmentobjekte wie zuvor sein.
Gibt es also eine Möglichkeit, den ViewPager so zu erzwingen, dass er getItem () erneut aufruft, damit ich die richtigen Verweise auf aktuelle Fragmente verwenden kann?
Was stimmt nicht mit den Fragmenten, die da sind?
Ich habe einige Tage damit verbracht, nach einer Lösung für dieses Problem zu suchen, und viele Punkte wurden herausgefunden:
Verwenden Sie FragmentPagerAdapter
anstelle von FragmentStatePagerAdapter
Verwenden Sie FragmentStatePagerAdapter
anstelle von FragmentPagerAdapter
gibt POSITION_NONE
auf getItemPosition
override von FragmentPagerAdapter
Verwenden Sie FragmentPagerAdapter nicht, wenn Sie dynamische Änderungen von Fragmenten benötigen
und viele, viele, viele andere ...
In meiner App, wie Eugene , habe ich mir die Instanzen der erstellten Fragmente selbst gemanagt. Ich behalte das in einem HashMap<String,Fragment>
in einer speziellen Klasse, also werden die Fragmente nie freigegeben, was meine App beschleunigt (aber mehr Ressourcen verbraucht).
Das Problem war, wenn ich mein Tablet (und Telefon) rotiere. Das getItem(int)
wurde für dieses Fragment nicht mehr aufgerufen, und ich konnte es nicht ändern.
Ich habe wirklich viel Zeit gebraucht, bis ich wirklich eine Lösung gefunden habe, also muss ich sie mit der StackOverflow-Community teilen, die mir so oft hilft ...
Die Lösung für dieses Problem, obwohl die harte Arbeit, es zu finden, ist ziemlich einfach:
Behalte einfach den Verweis auf FragmentManager im Konstruktor von FragmentPagerAdapter extends:
%Vor%Das ist alles. Und es wird wie ein Zauber wirken ...
Tags und Links android