Różnica między FragmentPagerAdapter i FragmentStatePagerAdapter
Jaka jest różnica między FragmentPagerAdapter
a FragmentStatePagerAdapter
?
About FragmentPagerAdapter
Google ' s guide says:
Ta wersja pagera jest najlepsza do użycia, gdy jest kilka zazwyczaj bardziej statyczne fragmenty, które mają być stronicowane, takie jak zestaw tabs. Fragment każdej strony odwiedzanej przez użytkownika będzie przechowywany w pamięć, choć jej hierarchia widoku może zostać zniszczona, gdy nie jest widoczna. Może to skutkować zużyciem znacznej ilości pamięci, ponieważ fragment instancje mogą posiadać na dowolny stan. Dla większych zestawów stron, rozważ FragmentStatePagerAdapter.
I O FragmentStatePagerAdapter
:
Ta wersja pagera jest bardziej przydatna, gdy jest duża liczba stron, działa bardziej jak widok listy. Gdy strony nie są widoczne dla użytkownika, ich cały fragment może zostać zniszczony, zachowując jedynie zapisany stan tego fragmentu. To pozwala pager trzymać się dużo mniej pamięci związanej z każdą odwiedzaną stroną jako w porównaniu do FragmentPagerAdapter kosztem potencjalnie większego obciążenia, gdy przełączanie między stronami.
Więc mam tylko 3 fragmenty. Ale wszystkie z nich są oddzielnymi modułami z dużą ilością danych.
Fragment1
obsługuje niektóre dane (które użytkownicy wprowadzają) i przekazuje je poprzez aktywność do Fragment2
, co jest po prostu prostym ListFragment
. Fragment3
jest również ListFragment
.
Moje pytania to: którego adaptera powinienem użyć? FragmentPagerAdapter
Czy FragmentStatePagerAdapter
?
6 answers
Jak mówią lekarze, pomyśl o tym w ten sposób. Jeśli miałbyś zrobić aplikację taką jak czytnik książek, nie będziesz chciał załadować wszystkich fragmentów do pamięci na raz. Chcesz załadować i zniszczyć Fragments
jak czyta użytkownik. W tym przypadku użyjesz FragmentStatePagerAdapter
. Jeśli wyświetlasz tylko 3 "zakładki", które nie zawierają dużo ciężkich danych (jak Bitmaps
), to FragmentPagerAdapter
może Ci pasować. Należy również pamiętać, że ViewPager
domyślnie ładuje do pamięci 3 fragmenty. Pierwsza Adapter
, o której wspomnisz może destroy View
hierarchii i ponownie załadować go w razie potrzeby, drugi Adapter
tylko zapisuje stan Fragment
i całkowicie go niszczy, jeśli użytkownik następnie wraca do tej strony, stan jest pobierany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-05 15:37:40
FragmentPagerAdapter
zapisuje cały fragment w pamięci i może zwiększenie nakładu pamięci w przypadku użycia dużej ilości fragmentów wViewPager
.W przeciwieństwie do swojego rodzeństwa,
FragmentStatePagerAdapter
przechowuje tylko savedInstanceState fragmentów, i niszczy wszystkie fragmenty, gdy tracą koncentrację.Dlatego
FragmentStatePagerAdapter
należy stosować, gdy musimy używaj fragmentów dynamicznych, takich jak fragmenty z widżetami, jako ich danych może być przechowywany wsavedInstanceState
.Również nie wpłynie to na wydajność nawet jeśli istnieje duża liczba fragmenty.Przeciwnie jego rodzeństwo
FragmentPagerAdapter
powinno być używane, gdy musimy zapisać cały fragment w pamięci.Kiedy mówię, że cały fragment jest zachowany w pamięci to znaczy, że jego instancje nie zostaną zniszczone i utworzą nadmiarową pamięć. Dlatego zaleca się stosowanie
FragmentPagerAdapter
tylko wtedy, gdy są małą liczbą fragmentów dlaViewPager
.Byłoby jeszcze lepiej, gdyby fragmenty były statyczne, ponieważ będą nie posiadać dużej ilości obiektów, których instancje byłyby przechowywany.
Aby być bardziej szczegółowym,
FragmentStatePagerAdapter:
Z
FragmentStatePagerAdapter
, Twój niepotrzebny fragment jest zniszczony.Transakcja jest zobowiązana do całkowitego usunięcia fragment z Twojej aktywnościFragmentManager
.Stan w
FragmentStatePagerAdapter
wynika z faktu, że zapisujeBundle
twojego fragmentu zsavedInstanceState
, gdy jest zniszczony.Kiedy użytkownik wraca, nowy fragment będzie przywrócony przy użyciu stanu fragmentu.
FragmentPagerAdapter:
Przez porównanie
FragmentPagerAdapter
nie robi nic w tym rodzaju.Kiedy fragment nie jest już potrzebny.FragmentPagerAdapter
rozmowydetach(Fragment)
na transakcję zamiastremove(Fragment)
.To jest widok fragmentu, ale pozostawia instancję fragmentu żywe w
FragmentManager
. tak więc fragmenty powstałe wFragmentPagerAdapter
are never zniszczony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 13:58:21
Coś, co nie jest wyraźnie powiedziane w dokumentacji lub odpowiedziach na tej stronie (nawet jeśli sugerowane przez @Naruto), jest to, że FragmentPagerAdapter
nie zaktualizuje fragmentów, jeśli dane w fragmencie ulegną zmianie, ponieważ przechowuje Fragment w pamięci.
Więc nawet jeśli masz ograniczoną liczbę fragmentów do wyświetlenia, jeśli chcesz być w stanie odświeżyć swoje fragmenty (na przykład ponownie uruchomić zapytanie, aby zaktualizować listView we fragmencie), musisz użyć / Align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center /
Chodzi mi o to, że liczba fragmentów i to, czy są one podobne, nie zawsze jest kluczowym aspektem do rozważenia. Kluczowe jest również to, czy Twoje fragmenty są dynamiczne.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-20 04:43:47
Oto cykl życia każdego fragmentu w ViewPager
, który ma 4 fragmenty i offscreenPageLimit = 1 (default value)
FragmentStatePagerAdapter
Przejdź do Fragment1 (aktywność startowa)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
Przejdź do Fragment2
Fragment3: onCreateView
Fragment3: onStart
Przejdź do Fragment3
Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart
Przejdź do Fragment4
Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy
FragmentPagerAdapter
Przejdź do Fragment1 (aktywność startowa)
Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart
Przejdź do Fragment2
Fragment3: onCreateView
Fragment3: onStart
Przejdź do Fragment3
Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart
Idź do Fragment4
Fragment2: onStop
Fragment2: onDestroyView
Wniosek: FragmentStatePagerAdapter
wywołanie onDestroy
gdy fragment zostanie pokonany offscreenPageLimit
podczas gdy FragmentPagerAdapter
nie.
Uwaga: myślę, że powinniśmy użyć FragmentStatePagerAdapter
dla ViewPager
, które mają dużo strony, ponieważ będzie to dobre dla wydajności.
Przykład z offscreenPageLimit
:
Jeśli pójdziemy do Fragment3, to usuniemy Fragment1 (lub Fragment5, jeśli mamy), ponieważ offscreenPageLimit = 1
. Jeśli ustawimy offscreenPageLimit > 1
to nie zniszczy .
Jeśli w tym przykładzie, ustawiamy offscreenPageLimit=4
, nie ma różnicy między używaniem FragmentStatePagerAdapter
lub FragmentPagerAdapter
, ponieważ Fragment nigdy nie wywołuje onDestroyView
i {[11] } kiedy zmieniamy tabulator
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-21 10:31:02
FragmentPagerAdapter
przechowuje poprzednie dane, które są pobierane z adaptera, podczas gdy FragmentStatePagerAdapter
pobiera nową wartość z adaptera za każdym razem, gdy jest wykonywana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-14 18:07:47
FragmentStatePagerAdapter = aby pomieścić dużą liczbę fragmentów w Viewpagerze. Ponieważ ten adapter niszczy fragment, gdy nie jest widoczny dla użytkownika i tylko savedInstanceState fragmentu jest przechowywany do dalszego użytku. W ten sposób zużywana jest niewielka ilość pamięci i lepsza wydajność w przypadku fragmentów dynamicznych.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-05 03:46:35