La différenciation entre l'utilisateur de faire défiler et d'programatic changement de page dans le ViewPager
J'ai un android.support.v4.view.ViewPager
dans mon application, et je voudrais faire la distinction entre une par programme initié par défilement fluide et une initiative de l'utilisateur touche de défilement.
J'ai eu un coup d'oeil à ViewPager.OnPageChangeListener
et je crois que la réponse réside peut-être là, mais je ne suis pas sûr de savoir comment.
Vous devez vous connecter pour publier un commentaire.
OK, si il s'avère que j'avais raison à propos de la réponse couché dans
ViewPager.onPageChangeListener
. En particulier, il se trouve dans l'utilisation deonPageScrollStateChanged(int state)
. Il y a essentiellement trois états qui, d'une page dans unViewPager
peut être dans:De sorte que le glissement de l'état se produit uniquement lorsque la page en cours est physiquement traîné par l'utilisateur. Ainsi, lorsque l'utilisateur a glissée une page, les états se produisent dans l'ordre suivant: Glisser -> Décantation -> Inactif. Maintenant, la
onPageSelected(int position)
méthode est appelée entre la "Décantation" et "Inactif" états. Ainsi, afin de déterminer si oui ou non un changement de page a été causé par un utilisateur de défilement, il suffit de vérifier que l'état précédent était "glisser" et que l'état actuel est "Décantation". Vous pouvez ensuite faire unboolean
variable de savoir si ou non le changement de page a été initié par l'utilisateur ou non et de le vérifier dans votreonPageSelected(int position)
méthode.Voici mon
onPageScrollStateChanged
méthodeLa
if
etelse if
états n'ont pas besoin d'être aussi explicite, mais je l'ai fait pour plus de clarté.wasUserScroll()
méthode à l'usage de tous. 🙂previousState
variable?Vous avez raison sur l'utilisation de
ViewPager.OnPageChangeListener
:Alternativement, vous pouvez utiliser des booléens drapeaux de différencier entre
programmatically-initiated smooth scroll and a user-initiated touch scroll
. Par exemple, si vous utilisezsetCurrentItem(int item)
de modifier par programmation la page, essayez:À l'intérieur de votre
ViewPager.OnPageChangeListener
:Je me suis donc basée sur la réponse marque comme correcte et dans les commentaires ci-dessous.
J'ai d'abord analyser comment le remplir auditeur de se comporter:
Résultats:
Comme vous pouvez le voir dans les deux cas, les événements de la fin lorsque le
onPageScrollStateChanged
déplacer àSCROLL_STATE_IDLE
, cela signifie que la veille est de la fin du cycleL'utilisateur événement est
SCROLL_STATE_DRAGGING
et puisSCROLL_STATE_SETTLING
qui sont 2states
différents que seulement 1state
pour la programmation de l'événementSCROLL_STATE_SETTLING
onPageSelected
qui se passe avant la fin du cycle, mais après, nous sommes en mesure de déterminer si le changement a été déclenchée par l'utilisateur ou par programme, donc, tout ce qui s'est passé avant nous dira à ce moment-là si c'était de l'utilisateur ou nonSolution:
Donc j'utilise un
List<Integer>
qui est réinitialisé à chaque fois que le cycle se termine, et pour être en mesure de savoir si l'utilisateur a déclenché l'événement dans leonPageSelected
méthode que j'ai vérifier la taille de laList
. Si la taille est 2 cela signifie que l'utilisateur de faire défiler le pager.Maintenant, cette classe peut facilement être hérité par un autre qui en ont besoin.