web-dev-qa-db-fra.com

Empêcher ViewPager de détruire les vues hors écran

J'ai un ViewPager connecté à un FragmentPagerAdapter qui affiche trois fragments. ViewPager semble détruire la vue d'un fragment hébergé lorsqu'il se trouve à plus d'un balayage de la position actuelle.

Ces vues sont toutes des listes simples et cette optimisation est totalement inutile, je voudrais donc la désactiver. Cela pose certains problèmes visuels, car des animations sont mises en place dans les listes et sont répétées une fois qu’elles ont été détruites et recréées. Il affiche également à chaque fois l'animation d'introduction de la barre de défilement (où la barre de défilement est brièvement visible pour indiquer que le défilement est possible), ce qui peut être gênant et la position de défilement actuelle de l'utilisateur est perdue au cours du processus.

De plus, il ne charge pas le troisième fragment avant le premier balayage, ce qui est problématique, car chaque fragment gère ses propres appels de service et je préférerais que les trois se déclenchent en même temps que l'activité se charge. Le retard du troisième appel de service est loin d'être idéal.

Existe-t-il un moyen de convaincre ViewPager de mettre fin à ce problème et de conserver tous mes fragments en mémoire?

127
chefgon

Dans révision 4 du Support Package, une méthode a été ajoutée à ViewPager. Elle vous permet de spécifier le nombre de pages hors écran à utiliser, plutôt que la valeur par défaut qui est 1.

Dans votre cas, vous souhaitez spécifier 2, de sorte que lorsque vous êtes sur la troisième page, la première ne soit pas détruite, et inversement.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
321
David Snabel-Caunt

Par défaut, ViewPager recrée les fragments lorsque vous glissez la page. Pour éviter cela, vous pouvez essayer l'une des deux choses suivantes:

1. Dans la méthode onCreate () de vos fragments, appelez setRetainInstance (true).

2. Si le nombre de fragments est fixe et relativement petit, alors dans votre onCreate (), ajoutez le code suivant:

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

Si je me souviens bien, la deuxième option est plus prometteuse. Mais je vous exhorte à essayer les deux et à voir lequel d'entre eux fonctionne.

7
Pankaj Talaviya

"Définissez le nombre de pages à conserver de chaque côté de la page en cours dans la hiérarchie de vues dans un état inactif. Les pages situées au-delà de cette limite seront recréées à partir de l'adaptateur si nécessaire."

http://developer.Android.com/reference/Android/support/v4/view/ViewPager.html#setOffscreenPageLimit (int)

3
Percy Vega