Verhindern Sie, dass ViewPager Ansichten außerhalb des Bildschirms zerstört

133

Ich habe einen ViewPager an einen FragmentPagerAdapter angeschlossen, der drei Fragmente anzeigt. Der ViewPager scheint die Ansicht eines gehosteten Fragments zu zerstören, wenn es mehr als einen Wisch von der aktuellen Position entfernt ist.

Diese Ansichten sind alles einfache Listen und diese Optimierung ist völlig unnötig, daher möchte ich sie deaktivieren. Es verursacht einige visuelle Probleme, da auf die Listen Layoutanimationen angewendet werden und diese Animationen wiedergegeben werden, nachdem sie zerstört und neu erstellt wurden. Außerdem wird jedes Mal die Intro-Animation der Bildlaufleiste angezeigt (wobei die Bildlaufleiste kurz sichtbar ist, um anzuzeigen, dass ein Bildlauf möglich ist), die ablenken kann, und die aktuelle Bildlaufposition des Benutzers geht dabei verloren.

Das dritte Fragment wird auch erst geladen, wenn der erste Wisch ausgeführt wird. Dies ist problematisch, da jedes Fragment seine eigenen Serviceaufrufe verarbeitet und ich es vorziehen würde, alle drei Fragmente gleichzeitig auszulösen, wenn die Aktivität geladen wird. Eine Verzögerung des dritten Serviceabrufs ist nicht ideal.

Gibt es eine Möglichkeit, ViewPager davon zu überzeugen, dieses Verhalten zu beenden und nur alle meine Fragmente im Speicher zu behalten?

Chefgon
quelle

Antworten:

332

In Revision 4 Version des Support Package wurde ViewPager eine Methode hinzugefügt, mit der Sie die Anzahl der zu verwendenden Offscreen-Seiten anstelle der Standardeinstellung 1 angeben können.

In Ihrem Fall möchten Sie 2 angeben, damit auf der dritten Seite die erste nicht zerstört wird und umgekehrt.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
David Snabel-Caunt
quelle
Hast du eine Idee, wie man das auf einem Coverflow macht?
Josephus
4
Hallo. In dem, woran ich arbeite, werden die Fragmente / Seiten dynamisch erstellt, so dass es eine unbestimmte Anzahl wahrscheinlicher Fragmente gibt. In diesem Fall geht es normalerweise auf 10 oder weniger. Wäre es nicht eine schlechte Speichernutzung, diese Lösung für so viele Seiten zu verwenden? Die Fragmente halten übrigens nur die Ansicht. Vielen Dank!
Mahkie
Diese Methode löst aus: "java.lang.IllegalStateException: Fragment bereits hinzugefügt:" Fehler für meine App.
Alicanbatur
Vielen Dank. Es hat einfach wirklich funktioniert. Ich hatte auch ein Problem wie @chefgon.
Prashant
@mahie die oben genannten Lösungen, wenn für Dies wird als Optimierung angeboten. Wenn Sie im Voraus die Anzahl * der Seiten kennen, die Sie unterstützen müssen, oder über Mechanismen zum verzögerten Laden * auf Ihren Seiten verfügen, kann das Optimieren dieser Einstellung Vorteile für die wahrgenommene Glätte * von Paging-Animationen und Interaktionen haben. Wenn Sie eine kleine Anzahl von Seiten (3-4) * haben, die Sie gleichzeitig aktiv halten können, wird weniger Zeit für das Layout von * neu erstellten Ansichtsunterbäumen aufgewendet, wenn die Benutzerseiten hin und her gehen
Asthme
8

Standardmäßig erstellt ViewPager die Fragmente neu, wenn Sie über die Seite wischen. Um dies zu verhindern, können Sie eines von zwei Dingen ausprobieren:

1. Rufen Sie in onCreate () Ihrer Fragmente setRetainInstance (true) auf.

2. Wenn die Anzahl der Fragmente fest und relativ gering ist, fügen Sie in onCreate () den folgenden Code hinzu:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

Wenn ich mich richtig erinnere, ist die zweite Option vielversprechender. Aber ich fordere Sie auf, beide auszuprobieren und zu sehen, welche davon funktionieren.

Pankaj Talaviya
quelle