404 votes

Quelle est la différence entre FragmentPagerAdapter et FragmentStatePagerAdapter ?

Quelle est la différence entre FragmentPagerAdapter et FragmentStatePagerAdapter ?

À propos de FragmentPagerAdapter Le guide de Google dit :

Cette version du téléavertisseur est la meilleure lorsqu'il y a une poignée d'utilisateurs. fragments typiquement plus statiques à parcourir, comme un ensemble d'onglets. onglets. Le fragment de chaque page visitée par l'utilisateur sera conservé en mémoire, bien que sa hiérarchie de vue puisse être détruite lorsqu'elle n'est pas visible. Cela peut entraîner l'utilisation d'une quantité importante de mémoire puisque le fragment peuvent conserver une quantité arbitraire d'états. Pour de plus grands ensembles de pages, envisagez FragmentStatePagerAdapter .

Et sur FragmentStatePagerAdapter :

Cette version du téléavertisseur est plus utile lorsqu'il y a un nombre important de pages, et fonctionne davantage comme une vue en liste. Lorsque les pages ne sont pas visibles pour l'utilisateur, leur fragment entier peut être détruit, en gardant seulement l'état état sauvegardé de ce fragment. Cela permet à l'afficheur de conserver beaucoup moins de mémoire associée à chaque page visitée. moins de mémoire associée à chaque page visitée, par rapport à FragmentPagerAdapter au prix d'une surcharge potentielle lors du le passage d'une page à l'autre.

Je n'ai donc que 3 fragments. Mais tous sont des modules séparés avec une grande quantité de données.

Fragment1 traite certaines données (saisies par les utilisateurs) et les transmet, par le biais de l'activité, aux services suivants Fragment2 qui est juste un simple ListFragment . Fragment3 est également un ListFragment .

Mes questions sont donc les suivantes : Quel adaptateur dois-je utiliser ? FragmentPagerAdapter o FragmentStatePagerAdapter ?

2 votes

Je pense que le fait de n'avoir que 3 fragments vous permet d'utiliser le FragmentPagerAdapter. Les onglets de ces fragments seront probablement tous visibles simultanément.

2 votes

Ce post a sauvé mes 5-6 heures parce que j'utilise le mauvais type d'adaptateur

1 votes

La réponse à cette question jette une autre question stackoverflow.com/questions/9156406/

318voto

Emmanuel Points 5911

Comme le disent les docteurs, pensez-y de cette façon. Si vous deviez faire une application comme un lecteur de livres, vous ne voudriez pas charger tous les fragments en mémoire en une seule fois. Vous voudriez charger et détruire Fragments au fur et à mesure que l'utilisateur lit. Dans ce cas, vous utiliserez FragmentStatePagerAdapter . Si vous n'affichez que 3 "onglets" qui ne contiennent pas beaucoup de données lourdes (par exemple Bitmaps ), alors FragmentPagerAdapter pourrait vous convenir. N'oubliez pas non plus que ViewPager par défaut, chargera 3 fragments en mémoire. Le premier Adapter que vous mentionnez pourrait détruire View et le recharger en cas de besoin, la seconde Adapter enregistre uniquement l'état de la Fragment et la détruit complètement, si l'utilisateur revient ensuite sur cette page, l'état est récupéré.

0 votes

J'ai plusieurs boutons et TextViews dans Fragment1 et ListView qui génèrent des éléments dynamiquement dans Fragment2 et Fragment3. Pensez-vous que c'est une bonne idée d'utiliser FragmentStatePagerAdapter et de stocker toutes les données dans Activity, en les passant aux fragments via Bundle ?

2 votes

@AlexMomotov Les vues dans la disposition du fragment n'ont rien à voir avec le choix du FragmentStatePagerAdapter. La question ici est la quantité de fragments qui seront paginés.

1 votes

Donc, fondamentalement, il n'y a rien en faveur de FragmentPagerAdapter pour l'utiliser.

143voto

Naruto Points 418

FragmentStatePagerAdapter :

  • avec FragmentStatePagerAdapter ,votre fragment inutile est détruit. Une transaction est engagée pour supprimer complètement le fragment de votre activité FragmentManager .

  • L'état en FragmentStatePagerAdapter vient du fait qu'il sauvera le fragment de votre Bundle de savedInstanceState quand Lorsque l'utilisateur navigue à nouveau, le nouveau fragment sera restauré en utilisant le statut du fragment. restauré en utilisant l'état du fragment.

FragmentPagerAdapter :

  • Par comparaison FragmentPagerAdapter ne fait rien de tel. le fragment n'est plus nécessaire. FragmentPagerAdapter appelle detach(Fragment) sur la transaction au lieu de remove(Fragment) .

  • Cela détruit la vue du fragment mais laisse l'instance du fragment. en vie dans la vue FragmentManager .donc les fragments créés dans le FragmentPagerAdapter ne sont jamais détruites.

2 votes

Pourquoi avez-vous deux réponses ?

0 votes

Quel est l'avantage de garder en mémoire des fragments entiers ?

4 votes

@Tomek : si le fragment suivant est déjà instancié (i.e. FragmentPagerAdapter), il sera prêt à être rendu lorsque vous le balayez, donc l'animation du balayage sera plus fluide. Avec FragmentStatePagerAdapter, l'instance de fragment suivante peut ne pas exister jusqu'à ce que vous glissiez vers elle, et si c'est un gros fragment qui est coûteux à créer, vous pouvez voir un bégaiement dans l'animation. C'est une question de performance par rapport à la consommation de mémoire.

71voto

Phan Van Linh Points 16963

Voici un cycle de vie du journal de chaque fragment dans ViewPager qui ont 4 fragments et offscreenPageLimit = 1 (default value)

FragmentStatePagerAdapter

Allez au Fragment1 (activité de lancement)

Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart

Aller au Fragment2

Fragment3: onCreateView
Fragment3: onStart

Aller au Fragment3

Fragment1: onStop
Fragment1: onDestroyView
Fragment1: onDestroy
Fragment1: onDetach
Fragment4: onCreateView
Fragment4: onStart

Aller au Fragment4

Fragment2: onStop
Fragment2: onDestroyView
Fragment2: onDestroy

FragmentPagerAdapter

Allez au Fragment1 (activité de lancement)

Fragment1: onCreateView
Fragment1: onStart
Fragment2: onCreateView
Fragment2: onStart

Aller au Fragment2

Fragment3: onCreateView
Fragment3: onStart

Aller au Fragment3

Fragment1: onStop
Fragment1: onDestroyView
Fragment4: onCreateView
Fragment4: onStart

Aller au Fragment4

Fragment2: onStop
Fragment2: onDestroyView

Conclusion : FragmentStatePagerAdapter appelez onDestroy lorsque le Fragment est surmonté offscreenPageLimit tandis que FragmentPagerAdapter pas.

Note : Je pense que nous devrions utiliser FragmentStatePagerAdapter pour un ViewPager qui ont beaucoup de pages parce que c'est bon pour la performance.

Ejemplo de offscreenPageLimit :

Si nous allons au Fragment 3, il se Détruire le Fragment1 (ou le Fragment5 s'il y en a) car offscreenPageLimit = 1 . Si nous définissons offscreenPageLimit > 1 il ne sera pas détruire.
Si dans cet exemple, nous définissons offscreenPageLimit=4 il n'y a aucune différence entre l'utilisation de FragmentStatePagerAdapter o FragmentPagerAdapter car Fragment n'appelle jamais onDestroyView et onDestroy quand on change d'onglet

Démo Github ici

39voto

JDenais Points 2037

Il y a quelque chose qui n'est pas explicitement dit dans la documentation ou dans les réponses de cette page (même si c'est sous-entendu par @Naruto), c'est que FragmentPagerAdapter ne mettra pas à jour les fragments si les données du fragment changent, car il garde le fragment en mémoire.

Ainsi, même si vous n'avez qu'un nombre limité de fragments à afficher, si vous souhaitez être en mesure de rafraîchir vos fragments (par exemple, si vous réexécutez la requête pour mettre à jour la listView dans le fragment), vous devez utiliser le FragmentStatePagerAdapter.

Ce que je veux dire, c'est que le nombre de fragments et leur similitude ou non ne sont pas toujours les éléments clés à prendre en compte. Le fait que vos fragments soient dynamiques ou non est également essentiel.

14voto

vinay kumar Points 149

FragmentPagerAdapter stocke les données précédentes qui sont récupérées de l'adaptateur tandis que FragmentStatePagerAdapter prend la nouvelle valeur de l'adaptateur à chaque fois qu'il est exécuté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X