Die Fragmente, die ich in meiner ViewPager
Instanz verwende, sind sehr ressourcenintensiv, daher möchte ich jeweils nur eines laden. Wenn ich Folgendes versuche:
mViewPager.setOffscreenPageLimit(0);
mViewPager.setAdapter(mPagerAdapter);
Meine FragmentStatePagerAdapter.getItem(int position)
Override-Funktion wird dreimal aufgerufen, was passiert, wenn ich anrufe mViewPager.setOffscreenPageLimit(1)
. Ich würde erwarten, dass es nur einmal aufgerufen wird, da ich 0 Offscreen-Seiten angegeben habe.
Ich glaube, ich rufe alles richtig an, denn wenn ich anrufe mViewPager.setOffscreenPageLimit(2)
, FragmentStatePagerAdapter.getItem(int position)
wird es 5 Mal angerufen, wie ich es erwarten würde.
Benötigt ViewPager mindestens 1 Offscreen-Seiten oder mache ich hier etwas falsch?
android
android-viewpager
android-support-library
Chris Lacy
quelle
quelle
ViewPager.setOffscreenPageLimit(2)
funktionierte für mich. TryViewPager.setOffscreenPageLimit(totTabs - 1)
Antworten:
Ja. Wenn ich den Quellcode richtig lese, sollten Sie in LogCat eine Warnung erhalten, etwa:
quelle
ViewPager
.ViewPager
Erstellt diese Fragmente so, dass die Ansichten vorhanden sind, sodass der Benutzer zwischen ihnen wischen kann. Der animierte Effekt zeigt, dass die alte Ansicht vom Bildschirm gleitet und die neue Ansicht auf den Bildschirm gleitet. Sie können gerne versuchen, Ihre eigenen zu schreibenViewPager
, die zwischen Dingen wechseln können, die es nicht gibt. Sie können mehr darüber unter code.google.com/p/android/issues/detail?id=56667#c3setOffscreenPageLimit(0)
zu sein 0. Dann kann ich die Konsequenzen selbst behandeln. Ein leeres Standardfragment kann beispielsweise ein Platzhalter sein, bis ein Fragment geladen wurde. All dies könnte außerhalb des UI-Threads stattfinden. Jedenfalls habe ich nicht viel darüber nachgedacht.ViewPager
und den Sie durch den tatsächlichen Inhalt ersetzen, sofern verfügbar .Der beste Weg, den ich gefunden habe, war setUserVisibleHint. Fügen
Sie dies Ihrem Fragment hinzu
quelle
Sie können Folgendes versuchen:
quelle
Zuerst hinzufügen
als
quelle
ViewPager lädt standardmäßig die nächste Seite (Fragment), die Sie nicht mit setOffscreenPageLimit (0) ändern können. Aber Sie können etwas tun, um zu hacken. Sie können die Funktion onPageSelected in Aktivität implementieren, die den ViewPager enthält. Im nächsten Fragment (das Sie nicht laden möchten) schreiben Sie eine Funktion, beispielsweise showViewContent (), in der Sie den gesamten ressourcenintensiven Init-Code eingeben und vor der onResume () -Methode nichts tun. Rufen Sie dann die Funktion showViewContent () in onPageSelected auf. Hoffe das wird helfen.
quelle
Das mag ein alter Thread sein, aber das scheint für mich zu funktionieren. Überschreiben Sie diese Funktion:
fröhliche Codierungen ...
quelle
In meinem Fall wollte ich einige Animationen in Ansichten starten, aber mit setUserVisibleHint gab es einige Probleme ...
meine Lösung ist:
1 / addOnPageChangeListener für Ihren Adapter:
2 / OnPageChangeListener implementieren:
3 / überschreibe die 3 Methoden:
4 / deklariere und initialisiere diese Variable in deiner Klasse
Hinweis : Ich habe drei Fragmente in meinem Adapter und verwende mTabState für setCurrentItem und die aktuelle Position des Adapters, die erkennen, welches Fragment dem Benutzer rechtzeitig angezeigt wird ... 5 / in der onPageSelected-Methode fügen Sie diese Codes hinzu:
Wenn die vorherige oder aktuelle Seite Seite 0 ist (Fragment an Position 0), dann machen Sie dieses Zeug
6 / Jetzt müssen Sie in Ihrer Fragmentklasse (Fragment an Position 0 des Adapters) einen Rundfunkempfänger erstellen, ihn in der onResume-Methode registrieren und die Registrierung bei onPause methos aufheben:
Zusammenfassung: Ich habe einen Fragment-Pager-Adapter, der drei Fragmente enthält. Ich möchte einige Animationen in Ansichten in Fragment in Position 0 des Adapters anzeigen. Dafür verwende ich BroadcastReceiver. Wenn Fragment ausgewählt ist, starte ich die Animationsmethode und zeige dem Benutzer die Ansichten. Wenn Fragment dem Benutzer nicht angezeigt wird, versuche ich, unsichtbare Ansichten anzuzeigen.
quelle
Bitte versuchen Sie diesen Code, um das Problem der Aktualisierung der Ansicht in Viewpager zu beheben.
quelle
Bereiten Sie für die Funktion "instantiateItem" nur das Fragment vor, laden Sie jedoch nicht den umfangreichen Inhalt.
Verwenden Sie "onPageChangeListener", damit Sie jedes Mal, wenn Sie zu einer bestimmten Seite gehen, deren umfangreichen Inhalt laden und anzeigen.
quelle
Ich habe irgendwie das gleiche Problem. Ich habe auf dieser Site nützlichen Code gefunden und ihn transformiert.
Das min int für mViewPager.setOffscreenPageLimit (...); ist 1, und selbst wenn Sie es auf 0 ändern, werden immer noch 2 Seiten geladen.
Als erstes müssen Sie ein statisches int erstellen. Wir rufen maxPageCount auf und überschreiben die FragmentStatePagerAdapter-Methode getCount (), um maxPageCount zurückzugeben:
Erstellen Sie dann eine statische Methode, auf die von einer beliebigen Stelle im Programm aus zugegriffen werden kann, mit der Sie diesen maxCount ändern können:
Initialisieren Sie nun maxPageCount auf 1. Wann immer Sie möchten, können Sie eine weitere Seite hinzufügen. In meinem Fall, als der Benutzer zuerst die aktuelle Seite behandeln musste, bevor die andere generiert wurde. Er macht es und kann dann problemlos zur nächsten Seite wischen.
Hoffe es hilft jemandem.
quelle
Verwenden Sie diesen // Booleschen Wert zum Abrufen von Daten. Privater Boolescher Wert isViewShown = false;
quelle