Cómo detectar si un listview está desplazándose hacia arriba o hacia abajo en android?

¿Hay una manera de identificar si listview se está desplazando hacia arriba o hacia abajo?

OnScrollListener no me puede ayudar en este caso.

¡Gracias por adelantado!

Esta es una implementación sencilla:

lv.setOnScrollListener(new OnScrollListener() { private int mLastFirstVisibleItem; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(mLastFirstVisibleItem<firstVisibleItem) { Log.i("SCROLLING DOWN","TRUE"); } if(mLastFirstVisibleItem>firstVisibleItem) { Log.i("SCROLLING UP","TRUE"); } mLastFirstVisibleItem=firstVisibleItem; } }); 

Hay un método en ScrollViews que informa el desplazamiento de desplazamientos. Se llama onScrollChanged() . Sin embargo, se declara protegido, por lo que debe crear una clase de contenedor para obtener acceso. Para el uso del método, compruebe por favor los documentos del androide.

En primer lugar, crear una interfaz para exponer el método protegido

 public interface OnScrollListener { void onScrollChanged(int x, int y, int oldx, int oldy); } 

A continuación, cree su contenedor y amplíe ScrollView

 public class ReportingScrollView extends ScrollView { private OnScrollListener onScrollListener = null; public ReportingScrollView(Context context) { super(context); } public ReportingScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ReportingScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public void setOnScrollListener(OnScrollListener onScrollListener) { this.onScrollListener = onScrollListener; } @Override protected void onScrollChanged(int x, int y, int oldx, int oldy) { super.onScrollChanged(x, y, oldx, oldy); if (onScrollListener != null) { onScrollListener.onScrollChanged(x, y, oldx, oldy); } } } 

Por último, incluirlo en su diseño XML como una vista personalizada, y adjuntar oyentes como de costumbre.

 <your.package.ReportingScrollView /> scrollingandtrolling.setOnScrollListener(new OnScrollListener() {...}); 

Una solución fácil y de trabajo.

 private int lastPosition = -1; @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(lastPosition == firstVisibleItem) { return; } if(firstVisibleItem > lastPosition) { Logger.print("Going Down"); } else { Logger.print("Going Up"); } lastPosition = firstVisibleItem; } 

La solución dada por Some Noob Student es buena: hay que crear un wrapper para usar el método protected onScrollChanged (int x, int y, int oldx, int oldy), que se dispara con más frecuencia que el estándar AbsListView.OnScrollListener.onScrollStateChanged Vista AbsListView, int scrollState).

Desafortunadamente el onScrollChanged () siempre devuelve 0 como parámetros, no importa cómo me desplace, y parece detectar sólo cuando el rollo termina, llegando a la parte superior o inferior de la lista.

Así que utilicé el código siguiente para detectar la dirección correcta del desplazamiento: utiliza el getTop () del primer elemento visible pero usa también su posición para entender cuando el primer elemento no es más visible; Durante esta transición de elemento, la dirección de desplazamiento se da por la posición del elemento en sí.

  @Override public void onScrollChanged(int x, int y, int oldx, int oldy) { if(listView.getChildAt(0) != null) { int scrollingDir = NO_SCROLLING; int firstChildTop = listView.getChildAt(0).getTop(); if (listView.getFirstVisiblePosition() == mLastFirstVisiblePosition) { if (mLastFirstChildTop < firstChildTop) { //Scrolling DOWN scrollingDir = SCROLLING_DOWN; } else if (mLastFirstChildTop > firstChildTop) { //Scrolling UP scrollingDir = SCROLLING_UP; } } else if(listView.getFirstVisiblePosition() > mLastFirstVisiblePosition) { //Scrolling UP scrollingDir = SCROLLING_UP; } else { //Scrolling DOWN scrollingDir = SCROLLING_DOWN; } mLastFirstVisiblePosition = listView.getFirstVisiblePosition(); mLastFirstChildTop = firstChildTop; switch(scrollingDir) { case SCROLLING_DOWN: //Your DOWN scrolling code here break; case SCROLLING_UP: //Your UP scrolling code here break; default: case NO_SCROLLING: break; } } } 
 list.setOnScrollListener(new OnScrollListener() { int last_item; @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(last_item<firstVisibleItem+visibleItemCount-1){ System.out.println("List is scrolling upwards"); } else if(last_item>firstVisibleItem+visibleItemCount-1){ System.out.println("List is scrolling downwards"); } last_item = firstVisibleItem+visibleItemCount-1; } }); 

Aquí, basado en el último elemento visible, decido si la lista sube o baja

  • Evento de la galería a "cuando la imagen se centró"
  • Desplácese hacia arriba ScrollView lentamente
  • Barra de desplazamiento en android
  • ¿Recyclerview hace que el último elemento agregado sea el elemento seleccionado?
  • Vista web de Android: detección de desplazamiento
  • ¿Cómo inhabilito el overscroll y el rebote en una lista de android?
  • Cómo habilitar el desplazamiento en un simpleadapter en el firmware X16 de Google Glass
  • Rellenar Listview de JSON
  • Android smoothScrollTo no invocando onScrollStateChanged
  • Deshabilitar el desplazamiento en la vista de lista
  • Limitar el número de líneas en TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.