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.

 241
Author: Emmanuel,
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 w ViewPager.

  • 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 w savedInstanceState.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 dla ViewPager.

  • 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ści FragmentManager.

  • Stan w FragmentStatePagerAdapter wynika z faktu, że zapisuje Bundle twojego fragmentu z savedInstanceState, 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 rozmowy detach(Fragment) na transakcję zamiast remove(Fragment).

  • To jest widok fragmentu, ale pozostawia instancję fragmentu żywe w FragmentManager. tak więc fragmenty powstałe w FragmentPagerAdapter are never zniszczony.

 104
Author: Luffy,
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.

 30
Author: JDenais,
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

Github demo tutaj

 13
Author: Phan Van Linh,
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.

 12
Author: vinay kumar,
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.

 2
Author: Dwivedi Ji,
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