Wir haben hier ein sehr seltsames Problem mit ViewPager. Wir binden Listen auf jeder ViewPager-Seite ein und lösen beim Aktualisieren von Listendaten notifyDataSetChanged sowohl auf dem Listenadapter als auch auf dem View Pager-Adapter aus.
Was wir beobachten, ist, dass die Seite manchmal ihren Ansichtsbaum nicht aktualisiert, dh leer bleibt oder manchmal sogar verschwindet, wenn sie darauf blättert. Wenn Sie ein paar Mal hin und her blättern, wird der Inhalt plötzlich wieder angezeigt. Es scheint, als ob Android hier ein Ansichtsupdate fehlt. Mir ist auch aufgefallen, dass beim Debuggen mit dem Hierarchie-Viewer die Auswahl einer Ansicht immer wieder angezeigt wird, anscheinend weil der Hierarchie-Viewer die ausgewählte Ansicht zwingt, sich selbst neu zu zeichnen.
Ich konnte diese Arbeit jedoch nicht programmgesteuert ausführen. Das Ungültigmachen der Listenansicht oder sogar des gesamten Ansichtspagers hatte keine Auswirkung.
Dies ist mit der kompatiblen v4_r7-Bibliothek der Fall. Ich habe auch versucht, die neueste Version zu verwenden, da sie behauptet, viele Probleme im Zusammenhang mit dem Anzeigen von Pager zu beheben, aber es hat die Sache noch schlimmer gemacht (zum Beispiel wurden Gesten gebrochen, so dass ich manchmal nicht mehr alle Seiten durchblättern konnte).
Stößt auch jemand anderes auf diese Probleme oder haben Sie eine Vorstellung davon, was dies verursachen könnte?
quelle
Wenn das
ViewPager
in einem Fragment mit a festgelegt istFragmentPagerAdapter
, verwenden SiegetChildFragmentManager()
anstelle vongetSupportFragmentManager()
als Parameter, um Ihr zu initialisierenFragmentPagerAdapter
.Anstatt
quelle
getItem()
auf ein ,FragmentPagerAdapter
die in einem neu Fragment verschachtelt wurde.Ich hatte genau das gleiche Problem, aber ich habe die Ansicht in destroyItem tatsächlich zerstört (dachte ich). Das Problem war jedoch, dass ich es mit
viewPager.removeViewAt(index);
insted of zerstört habeviewPager.removeView((View) object);
Falsch:
Richtig:
quelle
ViewPager versucht, clevere Dinge zu tun, um Gegenstände wiederzuverwenden, aber Sie müssen neue Gegenstandspositionen zurückgeben, wenn sich die Dinge geändert haben. Versuchen Sie, dies Ihrem PagerAdapter hinzuzufügen:
Im Grunde sagt es ViewPager, dass sich alles geändert hat (und zwingt es, alles neu zu instanziieren). Das ist das Einzige, woran ich auf Anhieb denken kann.
quelle
return POSITION_NONE;
,forces it to re-instantiate everything
aber in meinem Fall möchte ich nicht alles neu instanziieren. Wäre es also möglich, es zu entfernen,view
ohne das vorhandene Material zu löschen ? Bitte lassen Sie es mich wissenVersuchte zu viele Lösungen,
viewPager.post()
funktionierte aber unerwartetquelle
Die Android Support Library verfügt über eine Demo-Aktivität, die auf jeder Seite einen ViewPager mit einer ListView enthält. Sie sollten wahrscheinlich einen Blick darauf werfen und sehen, was es tut.
In Eclipse (mit Android Dev Tools r20):
New > Android Sample Project
Support4Demos
Android Tools > Add Support Library
Fragment
und dannPager
Der Code dafür ist in
src/com.example.android.supportv4.app/FragmentPagerSupport.java
. Viel Glück!quelle
Ich bin darauf gestoßen und hatte sehr ähnliche Probleme. Ich habe es sogar beim Stapelüberlauf gefragt .
Für mich hat im Elternteil des Elternteils meiner Ansicht jemand
LinearLayout
untergeordnet und überschrieben,requestLayout()
ohne anzurufensuper.requestLayout()
. Dies verhindertonMeasure
undonLayout
aus auf meinem ViewPager genannt wird (obwohl hierarchyviewer diese manuell aufruft). Ohne gemessen zu werden, werden sie in ViewPager als leer angezeigt.Überprüfen Sie also Ihre enthaltenen Ansichten. Stellen Sie sicher, dass sie in View eine Unterklasse haben und requestLayout oder ähnliches nicht blind überschreiben.
quelle
Hatte das gleiche Problem, was etwas damit zu tun hat
ListView
(weil meine leere Ansicht gut angezeigt wird, wenn die Liste leer ist). Ich habe geraderequestLayout()
das Problem angesprochenListView
. Jetzt zieht es gut!quelle
Bei der Verwendung von ViewPager und FragmentStatePagerAdapter trat dasselbe Problem auf. Ich habe versucht, mit einem Handler mit einer Verzögerung von 3 Sekunden invalidate () und requestLayout () aufzurufen, aber es hat nicht funktioniert. Was funktioniert hat, war das Zurücksetzen der Hintergrundfarbe des viewPager wie folgt:
MyFragment.java
quelle
Ich hatte ein Problem mit den gleichen Symptomen, aber eine andere Ursache, die sich als dummer Fehler herausstellte. Ich dachte, ich würde es hier hinzufügen, falls es jemandem hilft.
Ich hatte einen ViewPager mit FragmentStatePagerAdapter, der früher zwei Fragmente hatte, aber später fügte ich ein drittes hinzu. Ich habe jedoch vergessen, dass das Standardlimit für Seiten außerhalb des Bildschirms 1 ist. Wenn ich also zum neuen dritten Fragment wechsle, wird das erste zerstört und nach dem Zurückschalten neu erstellt. Das Problem war, dass meine Aktivität dafür verantwortlich war, diese Fragmente zu benachrichtigen, um ihren UI-Status zu initialisieren. Dies funktionierte zufällig, wenn die Aktivität und der Fragmentlebenszyklus gleich waren, aber um dies zu beheben, musste ich die Fragmente ändern, um ihre eigene Benutzeroberfläche während ihres Startlebenszyklus zu initialisieren. Am Ende habe ich auch setOffscreenPageLimit auf 2 geändert, damit alle drei Fragmente jederzeit am Leben bleiben (in diesem Fall sicher, da sie nicht sehr speicherintensiv waren).
quelle
Ich hatte ein ähnliches Problem. Ich speichere Ansichten zwischen, da ich nur 3 Ansichten benötige
ViewPager
. Wenn ich vorwärts rutsche, ist alles in Ordnung, aber wenn ich anfange rückwärts zu rutschen, tritt ein Fehler auf, der besagt, dass "meine Ansicht bereits ein übergeordnetes Element hat". Die Lösung besteht darin, nicht benötigte Elemente manuell zu löschen.quelle
Für mich kam das Problem auf die Aktivität zurück, nachdem der App-Prozess beendet wurde. Ich verwende einen benutzerdefinierten View-Pager-Adapter, der von den Android-Quellen geändert wurde. Der View-Pager ist direkt in die Aktivität eingebettet.
Berufung
viewPager.setCurrentItem(position, true);
(mit Animation) nach dem Setzen der Daten und notifyDataSetChanged () scheint zu funktionieren, aber wenn der Parameter auf false gesetzt ist, funktioniert dies nicht und das Fragment ist leer. Dies ist ein Randfall, der jemandem helfen kann.
quelle