Android: Détecte quand ScrollView cesse de défiler

J’utilise un ScrollView dans Android et où la partie visible de ScrollView la même taille que l’une des cellules dans la vue de Scrollview . Chaque “cellule” a la même hauteur. Donc, ce que j’essaie de faire, c’est de prendre position après le ScrollView .

Actuellement, je détecte quand l’utilisateur a touché le ScrollView et quand il a commencé à défiler et à le travailler à partir de là, mais c’est assez bogué. Il doit également fonctionner lorsque l’utilisateur le feuillette et qu’il défile puis décélère.

Sur iPhone, il y a une fonction qui ressemble à didDecelerate et je peux y faire n’importe quel code lorsque ScrollView a fini de défiler. Y a-t-il une telle chose avec Android? Ou y a-t-il un code que je pourrais examiner pour trouver une meilleure façon de le faire?

J’ai regardé les documents Android et je n’ai rien trouvé de tel.

J’ai récemment dû mettre en œuvre la fonction que vous avez décrite. Ce que j’ai fait était d’avoir un Runnable vérifiant si ScrollView avait cessé de défiler en comparant la valeur renvoyée par getScrollY () lorsque le onTouchEvent est déclenché pour la première fois avec la valeur renvoyée après un délai défini par la variable newCheck .

Voir le code ci-dessous (solution de travail):

 public class MyScrollView extends ScrollView{ private Runnable scrollerTask; private int initialPosition; private int newCheck = 100; private static final Ssortingng TAG = "MyScrollView"; public interface OnScrollStoppedListener{ void onScrollStopped(); } private OnScrollStoppedListener onScrollStoppedListener; public MyScrollView(Context context, AtsortingbuteSet attrs) { super(context, attrs); scrollerTask = new Runnable() { public void run() { int newPosition = getScrollY(); if(initialPosition - newPosition == 0){//has stopped if(onScrollStoppedListener!=null){ onScrollStoppedListener.onScrollStopped(); } }else{ initialPosition = getScrollY(); MyScrollView.this.postDelayed(scrollerTask, newCheck); } } }; } public void setOnScrollStoppedListener(MyScrollView.OnScrollStoppedListener listener){ onScrollStoppedListener = listener; } public void startScrollerTask(){ initialPosition = getScrollY(); MyScrollView.this.postDelayed(scrollerTask, newCheck); } } 

Ensuite j’ai:

 scroll.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { scroll.startScrollerTask(); } return false; } }); scroll.setOnScrollStoppedListener(new OnScrollStoppedListener() { public void onScrollStopped() { Log.i(TAG, "stopped"); } }); 

BTW j’ai utilisé quelques idées d’autres réponses pour le faire dans mon application. J’espère que cela t’aides. Toutes les questions sont libres de demander. À votre santé.