Les fragments que j'utilise dans mon ViewPager
exemple sont assez gourmands en ressources, je voudrais donc n'en charger qu'un à la fois. Quand j'essaye ce qui suit:
mViewPager.setOffscreenPageLimit(0);
mViewPager.setAdapter(mPagerAdapter);
Ma FragmentStatePagerAdapter.getItem(int position)
fonction de remplacement est appelée 3 fois, ce qui se produit lorsque j'appelle mViewPager.setOffscreenPageLimit(1)
. Je m'attendrais à ce qu'il ne soit appelé qu'une seule fois, car j'ai spécifié 0 pages hors écran.
Je crois que j'appelle tout correctement, car si j'appelle mViewPager.setOffscreenPageLimit(2)
, FragmentStatePagerAdapter.getItem(int position)
est appelé 5 fois comme je m'y attendais.
ViewPager nécessite-t-il au moins 1 pages hors écran, ou est-ce que je fais quelque chose de mal ici?
android
android-viewpager
android-support-library
Chris Lacy
la source
la source
ViewPager.setOffscreenPageLimit(2)
fonctionné pour moi. EssayezViewPager.setOffscreenPageLimit(totTabs - 1)
Réponses:
Oui. Si je lis correctement le code source, vous devriez recevoir un avertissement à ce sujet dans LogCat, quelque chose comme:
la source
ViewPager
.ViewPager
crée ces fragments pour que les vues existent, afin que l'utilisateur puisse les glisser entre elles, avec l'effet animé montrant l'ancienne vue glissant hors de l'écran et la nouvelle vue glissant sur l'écran. Vous êtes invités à essayer d'écrire le vôtreViewPager
qui peut glisser entre des éléments qui n'existent pas. Vous pouvez en lire plus à ce sujet à code.google.com/p/android/issues/detail?id=56667#c3setOffscreenPageLimit(0)
de 0. Ensuite, je peux gérer moi-même les conséquences. Un fragment vide par défaut peut être un espace réservé par exemple jusqu'à ce qu'un fragment soit chargé. Tout cela pourrait avoir lieu hors du fil de l'interface utilisateur. De toute façon, je n'y ai pas beaucoup réfléchi.ViewPager
, celui que vous remplacez le contenu réel lorsque disponible .Le meilleur moyen que j'ai trouvé était setUserVisibleHint,
ajoutez ceci à votre fragment
la source
Vous pouvez essayer comme ceci:
la source
Premier ajout
que
la source
ViewPager est par défaut pour charger la page suivante (Fragment) que vous ne pouvez pas modifier par setOffscreenPageLimit (0). Mais vous pouvez faire quelque chose pour pirater. Vous pouvez implémenter la fonction onPageSelected dans Activity contenant le ViewPager. Dans le fragment suivant (que vous ne voulez pas charger), vous écrivez une fonction, disons showViewContent () où vous mettez tout le code d'initialisation consommant des ressources et ne faites rien avant la méthode onResume (). Appelez ensuite la fonction showViewContent () dans onPageSelected. J'espère que cela aidera.
la source
cela peut être un vieux fil mais cela semble fonctionner pour moi. Remplacez cette fonction:
codages heureux ...
la source
dans mon cas, je voulais démarrer des animations dans les vues, mais avec setUserVisibleHint j'ai eu quelques problèmes ...
ma solution est:
1 / addOnPageChangeListener pour votre adaptateur:
2 / implémenter OnPageChangeListener:
3 / écraser les 3 méthodes:
4 / déclarez et initialisez cette variable sur votre classe
Remarque : j'ai trois fragments dans mon adaptateur et j'utilise mTabState pour setCurrentItem et la position actuelle de l'adaptateur qui reconnaissent quel fragment est montré à l'utilisateur dans le temps ... 5 / dans la méthode onPageSelected, ajoutez ces codes:
si la page précédente ou la page actuelle est la page 0 (fragment en position 0), alors faites ceci
6 / maintenant dans votre classe de fragment (fragment en position 0 de l'adaptateur), vous devez créer un récepteur de diffusion et l'enregistrer dans la méthode onResume et le désinscrire onPause methos:
résumé: j'ai un adaptateur de pageur de fragments qui montre trois fragments, je veux montrer quelques animations sur les vues dans le fragment en position 0 de l'adaptateur, pour cela, j'utilise BroadcastReceiver. Lorsque le fragment est sélectionné, je lance la méthode d'animation et montre les vues à l'utilisateur, lorsque le fragment n'est pas affiché à l'utilisateur, j'essaye les vues invisibles ...
la source
Veuillez essayer ce code pour résoudre le problème d'actualisation de la vue dans Viewpager ...
la source
pour la fonction "instantiateItem", préparez simplement le fragment, mais ne chargez pas le contenu lourd.
Utilisez "onPageChangeListener", de sorte qu'à chaque fois que vous accédez à une page spécifique, vous chargez son contenu lourd et l'affichez.
la source
J'ai en quelque sorte le même problème. J'ai trouvé du code utile sur ce site et je l'ai transformé.
Le min entier pour mViewPager.setOffscreenPageLimit (...); vaut 1, donc même si vous le changez à 0, vous aurez toujours 2 pages chargées.
La première chose à faire est de créer un int statique, nous appellerons maxPageCount et remplacerons la méthode FragmentStatePagerAdapter getCount () pour renvoyer maxPageCount:
Créez ensuite une méthode statique accessible de n'importe où dans le programme qui vous permettra de modifier ce maxCount:
Maintenant, initialisez maxPageCount à 1. Quand vous le souhaitez, vous pouvez ajouter une autre page. Dans mon cas, lorsque j'ai eu besoin de l'utilisateur pour traiter la page actuelle avant de générer l'autre. Il le fait et ensuite, sans problème, peut passer à la page suivante.
J'espère que cela aidera quelqu'un.
la source
Utilisez This // create boolean pour récupérer des données private boolean isViewShown = false;
la source