Fragmenty, których używam w mojej ViewPager
instancji, są dość zasobochłonne, więc chciałbym ładować tylko jeden naraz. Kiedy próbuję wykonać następujące czynności:
mViewPager.setOffscreenPageLimit(0);
mViewPager.setAdapter(mPagerAdapter);
Moja FragmentStatePagerAdapter.getItem(int position)
funkcja nadpisywania jest wywoływana 3 razy, co się dzieje, gdy dzwonię mViewPager.setOffscreenPageLimit(1)
. Spodziewałbym się, że zostanie wywołany tylko raz, ponieważ podałem 0 stron pozaekranowych.
Wydaje mi się, że wszystko dzwonię poprawnie, bo jak dzwonię mViewPager.setOffscreenPageLimit(2)
, dzwoni FragmentStatePagerAdapter.getItem(int position)
5 razy, jak bym się spodziewał.
Czy ViewPager wymaga co najmniej 1 strony poza ekranem, czy też robię coś nie tak?
android
android-viewpager
android-support-library
Chris Lacy
źródło
źródło
ViewPager.setOffscreenPageLimit(2)
działało dla mnie. SpróbujViewPager.setOffscreenPageLimit(totTabs - 1)
Odpowiedzi:
Tak. Jeśli dobrze czytam kod źródłowy, powinieneś otrzymać ostrzeżenie o tym w LogCacie, coś takiego:
źródło
ViewPager
.ViewPager
tworzy te fragmenty, aby widoki istniały, aby użytkownik mógł przesuwać się między nimi, z animowanym efektem pokazującym zsuwanie się starego widoku z ekranu i przesuwanie nowego widoku na ekran. Możesz spróbować napisać własną,ViewPager
która może przesuwać się między rzeczami, które nie istnieją. Możesz przeczytać więcej na ten temat na code.google.com/p/android/issues/detail?id=56667#c3setOffscreenPageLimit(0)
0. Wtedy sam poradzę sobie z konsekwencjami. Domyślny pusty fragment może być na przykład symbolem zastępczym do czasu załadowania fragmentu. Wszystko to może mieć miejsce poza wątkiem interfejsu użytkownika. Zresztą nie myślałem o tym dużo.ViewPager
, taki, który zastępujesz rzeczywistą treścią, gdy jest dostępny .Najlepszy sposób, jaki znalazłem, to setUserVisibleHint
dodaj to do swojego fragmentu
źródło
Możesz spróbować tak:
źródło
Najpierw dodaj
niż
źródło
ViewPager domyślnie ładuje następną stronę (fragment), której nie można zmienić za pomocą setOffscreenPageLimit (0). Ale możesz coś zrobić, żeby się włamać. Funkcję onPageSelected można zaimplementować w działaniu zawierającym ViewPager. W następnym fragmencie (którego nie chcesz ładować), piszesz funkcję, powiedzmy showViewContent (), w której umieszczasz cały kod init pochłaniający zasoby i nie robisz nic przed metodą onResume (). Następnie wywołaj funkcję showViewContent () wewnątrz onPageSelected. Mam nadzieję, że to pomoże.
źródło
może to być stary wątek, ale wydaje mi się, że działa. Zastąp tę funkcję:
szczęśliwe kodowanie ...
źródło
w moim przypadku chciałem uruchomić animacje w widokach, ale z setUserVisibleHint mam kilka problemów ...
moje rozwiązanie to:
1 / addOnPageChangeListener dla twojego adaptera:
2 / Zaimplementuj OnPageChangeListener:
3 / zastąpić 3 metody:
4 / zadeklaruj i zainicjalizuj tę zmienną w swojej klasie
uwaga : mam trzy fragmenty w moim adapterze i używam mTabState dla setCurrentItem i aktualnej pozycji adaptera, które rozpoznają, który fragment jest wyświetlany użytkownikowi w czasie ... 5 / w metodzie onPageSelected dodaj następujące kody:
jeśli poprzednia lub bieżąca strona to strona 0 (fragment na pozycji 0), zrób to
6 / teraz w swojej klasie fragmentów (fragment na pozycji 0 adaptera) należy stworzyć odbiornik rozgłoszeniowy i zarejestrować go w metodzie onResume oraz wyrejestrować go metody onPause:
podsumowanie: mam Fragment Pager Adapter, który pokazuje w nim trzy fragmenty, chcę pokazać animacje na widokach w fragmencie w pozycji 0 adaptera, do tego używam BroadcastReceiver. Po wybraniu fragmentu uruchamiam metodę Animation i pokazuję widoki użytkownikowi, gdy fragment nie jest wyświetlany użytkownikowi, próbuję wyświetlić niewidoczne widoki ...
źródło
Wypróbuj ten kod, aby rozwiązać problem z odświeżaniem widoku w Viewpager ....
źródło
w przypadku funkcji „instantiateItem” po prostu przygotuj fragment, ale nie ładuj ciężkiej zawartości.
Użyj "onPageChangeListener", aby za każdym razem, gdy przechodzisz do określonej strony, ładowałeś jej ciężką zawartość i wyświetlał ją.
źródło
Mam taki sam problem. Znalazłem przydatny kod na tej stronie i przekształciłem go.
Minimalna wartość int dla mViewPager.setOffscreenPageLimit (...); wynosi 1, więc nawet jeśli zmienisz ją na 0, nadal będziesz mieć załadowane 2 strony.
Pierwszą rzeczą do zrobienia jest utworzenie statycznego int, który wywołujemy maxPageCount i nadpisujemy metodę FragmentStatePagerAdapter getCount (), aby zwrócić wartość maxPageCount:
Następnie utwórz statyczną metodę dostępną z dowolnego miejsca w programie, która pozwoli Ci zmienić ten maxCount:
Teraz zainicjuj maxPageCount na 1. Kiedy chcesz, możesz dodać kolejną stronę. W moim przypadku, gdy potrzebowałem, aby użytkownik najpierw potraktował bieżącą stronę, zanim wygenerował drugą. Robi to, a potem bez problemu może przejść na następną stronę.
Mam nadzieję, że to komuś pomoże.
źródło
Use This // create boolean do pobierania danych private boolean isViewShown = false;
źródło