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.
- Android - Cómo permitir el desplazamiento horizontal y vertical
- Navegador predeterminado de Android que no se desplaza en la página web
- Casilla de verificación desmarcada cuando hago scrolllistview en Android
- Soluciones para GridView.scrollTo ()?
- Desplazamiento de imagen enriquecido y zoom en android
¡Gracias por adelantado!
- Clase Android ImageViewer que admite Pinch-Zoom y desplazamiento
- Cómo detectar Android ListView Scrolling se detuvo?
- ListView - ImageLoader mueve Lista / Elementos en Scroll up
- ¿Puedo deshabilitar el desplazamiento en TextView cuando se utiliza LinkMovementMethod?
- Webview no desplazamiento después de agregar setOnTouchListener
- Control de página Android como el control de página de iPhone
- ¿Cómo desplazarse a la parte inferior de un RecyclerView? ScrollToPosition no funciona
- Vista previa de desplazamiento en Viewpager
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
- El ajuste del nivel de alfa en la vista no funciona
- Cómo ver datos detallados de un elemento de vista de lista específico