Zapobiegaj niszczeniu widoków pozaekranowych przez ViewPager

133

Mam ViewPager podłączonego do FragmentPagerAdapter, który wyświetla trzy fragmenty. ViewPager wydaje się niszczyć widok hostowanego fragmentu, gdy jest więcej niż jedno przesunięcie od bieżącej pozycji.

Wszystkie te widoki są prostymi listami i ta optymalizacja jest całkowicie niepotrzebna, więc chciałbym ją wyłączyć. Powoduje to pewne problemy wizualne, ponieważ listy mają zastosowane animacje układu, a te animacje są odtwarzane po ich zniszczeniu i odtworzeniu. Pokazuje również animację wprowadzającą paska przewijania za każdym razem (gdzie pasek przewijania jest przez chwilę widoczny, aby wskazać, że przewijanie jest możliwe), co może rozpraszać uwagę, a bieżąca pozycja przewijania użytkownika jest tracona w trakcie procesu.

Nie ładuje również trzeciego fragmentu, dopóki nie nastąpi pierwsze przesunięcie, co jest problematyczne, ponieważ każdy fragment obsługuje własne wywołania usługi i wolałbym, aby wszystkie trzy odpalały w tym samym czasie, gdy ładowanie działania. Opóźnienie trzeciego wezwania serwisowego jest mniej niż idealne.

Czy jest jakiś sposób, aby przekonać ViewPagera do zaprzestania tego zachowania i zachowania wszystkich moich fragmentów w pamięci?

chefgon
źródło

Odpowiedzi:

332

W wersji 4 pakietu pomocy technicznej do ViewPager dodano metodę, która umożliwia określenie liczby stron pozaekranowych do użycia zamiast domyślnej 1.

W twoim przypadku chcesz podać 2, aby na trzeciej stronie pierwsza nie została zniszczona i odwrotnie.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
David Snabel-Caunt
źródło
masz pomysł, jak to zrobić na okładce?
josephus
4
Dzień dobry. W tym, nad czym pracuję, fragmenty / strony są tworzone dynamicznie, więc istnieje nieokreślona liczba prawdopodobnych fragmentów. W tym przypadku zwykle wynosi 10 lub mniej. Czy użycie tego rozwiązania do tak dużej liczby stron nie byłoby słabym wykorzystaniem pamięci? Nawiasem mówiąc, fragmenty będą tylko podtrzymywać widok. Dzięki!
mahkie
Ta metoda zgłasza: „java.lang.IllegalStateException: Fragment już dodany:” błąd dla mojej aplikacji.
alicanbatur
Wielkie dzięki. Po prostu naprawdę zadziałało. Ja też miałem taki sam problem jak @chefgon.
Prashant
@mahie powyższe rozwiązania, jeśli dla To jest oferowane jako optymalizacja. Jeśli znasz z góry liczbę * stron, które będziesz musiał obsługiwać, lub posiadasz mechanizmy leniwego ładowania * na swoich stronach, dostosowanie tego ustawienia może przynieść korzyści w postaci postrzeganej płynności * animacji stronicowania i interakcji. Jeśli masz niewielką liczbę stron (3-4) *, które możesz zachować wszystkie naraz, mniej czasu będzie poświęcone na układ * nowo utworzonych poddrzew widoku, ponieważ strony użytkownika tam iz powrotem
Asthme
8

Domyślnie ViewPager odtwarza fragmenty podczas przesuwania strony. Aby temu zapobiec, możesz wypróbować jedną z dwóch rzeczy:

1. W onCreate () twoich fragmentów, wywołaj setRetainInstance (true).

2. Jeśli liczba fragmentów jest stała i stosunkowo mała, to w swojej onCreate () dodaj następujący kod:

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

Jeśli dobrze pamiętam, druga opcja jest bardziej obiecująca. Ale zachęcam do wypróbowania obu i sprawdzenia, które z nich działają.

Pankaj Talaviya
źródło