setCurrentItem dans ViewPager ne défile pas immédiatement dans la bonne position
- Je utiliser un PagerAdapter. J'ai beaucoup d'éléments, donc je ne charge pas tous les éléments en même temps. - Je recharger la carte, j'ai changer les éléments anciens par les nouveaux éléments. Par exemple, j'ai les 4 éléments, quand j'arrive au dernier élément, je recharge les éléments et j'appelle setCurentItem(1) pour être en mesure de montrer la viewpager en position on. J'ai fait beaucoup de tests. J'ai mis:
viewPager.setCurrentItem(1,false); //But not scroll, put drastically the new page.
viewPager.setCurrentItem(1);
J'ai essayé de modifier onPageScrollStateChanged(int arg0), je n'ai que 3 points de vue et toujours ubicate dans le milieu.
if (arg0 == ViewPager.SCROLL_STATE_DRAGGING) {
if(focusedPage==2) {
//Modify adapter
viewPager.setCurrentItem(1,false);
}else if(focusedPage==0){
//Modify adapter
viewPager.setCurrentItem(1,false);
}
Et j'ai essayé de modifier onPageSelected(int arg0)
focusedPage=arg0;
À l'aide de ce dernier exemple que j'ai faites défiler les points de vue immédiatement, mais toujours il est situé à la dernière page.
Quelqu'un sait comment je peux glisser.
Merci
source d'informationauteur MARM
Vous devez vous connecter pour publier un commentaire.
Puis-je en savoir plus sur le contexte de ce que vous essayez d'accomplir?
De toute façon, de ce que je peux comprendre que vous essayez de faire un "infini"
ViewPager
passe de la dernière à la première et vice versa (corrigez-moi si je me trompe). Et vous voulez que votreViewPager
pour aller à la première page, mais le défilement - pas seulement d'apparaître de nulle part.Bien, si vous désactiver le défilement fluide (le deuxième paramètre), puis il va aller directement à la page que vous souhaitez, sans défilement de mouvement (et pas "changer" pour les autres pages sur le chemin), et si vous activez le défilement régulier alors il faudra passer par tous les points de vue, donc, vous allez voir comment c'était pas le prochain, mais le premier.
Ce que je peux vous recommander avec cela à l'esprit, c'est que vous pouvez essayer d'ajouter "factice" afficher les positions 0 et "dernier" et la vue en position 0, serait la même que la position de "dernier - 1" et le "dernier" point de vue serait la même que la position "1". Donc, vous ferez tout est normal, SAUF que sur le OnPageChangeListener vous permettra de vérifier si la page en cours est la position "0" ou "dernier" et si elle l'est, vous allez appeler setCurrentItem("1", false) ou setCurrentItem("last - 1", false) selon la position où vous vous trouvez maintenant. Cela vous permettra de garder la page "modifier" en effet, tout en accomplissant ce que vous voulez.
J'espère que cela peut vous aider avec votre problème.
REMARQUE:
Il peut avoir un lag changer après votre arrivée à la nouvelle position, car il aura à charge de l'affichage de l'actuel, le prochain et dernier points de vue (ou si vous êtes sur 4.0+, alors il se charge uniquement de la position réelle).
Mise à JOUR:
Si vous modifiez le contenu de la Liste/Tableau qui détermine le contenu de la
ViewPager
vous devez appeler:Mise à JOUR 2:
Pourquoi n'avez-vous pas d'ajouter tous les éléments de la
ViewPager
? leViewPager
a déjà optimisation pour le traitement de ces cas, dans mon cas, j'ai beaucoup d'éléments, et il se porte comme un charme.Autre chose, dans ton code je vois que vous changez le milieu de la page à chaque fois qu'une page est "décantation". Mais alors vous avez vraiment ne jamais montrer à droite et à gauche de la vue, alors pourquoi avez-vous?
Dernière chose, lorsque vous modifiez votre jeu de données, vous devez appeler la "notifyDataSetChanged" la méthode que j'ai mentionné ci-dessus, puis vous appelez le "setCurrentItem" méthode à l'intérieur d'un gestionnaire. Si vous ne le faites pas, votre application ne fonctionnera pas comme prévu.
Mise à JOUR 3:
Bien, la seule chose que je peux recommander, c'est d'avoir une Liste où vous continuez d'ajouter de nouveaux objets que vous apportez à partir de la base de données, puis aussi longtemps que vous gardez de l'insertion d'objets à la fin de la Liste il n'y a pas de problème. Si vous souhaitez ajouter des objets dans le milieu ou au début puis vous devez appeler la notifyDataSetChanged mais qui va être un peu lent, car il va générer des points de vue à nouveau. Nous faire de cette façon et ça fonctionne parfaitement et nous avons même télécharger les informations d'un serveur, les données n'est pas locale (Et en fait nous avons ajouter des informations à la fin et au début de la Liste).
Si vous avez d'autres questions sur la façon de réaliser cela, n'hésitez pas à demander.
Mise à JOUR 4:
Juste au cas où quelqu'un est actuellement à la recherche d'une circulaire
ViewPager
j'ai ajouté un la preuve de concept de code que vous pouvez ré-utiliser. Il fonctionne sans problème et je l'ai utilisé avec des vues complexes et il n'y a toujours pas de lag que ce soit.Il ne fonctionne pas sans un postDelayed, essayez avec ce code: