Cómo detectar si un ListView se desplaza rápidamente

¿Hay una manera de detectar si un ListView es desplazamiento rápido? Es decir, ¿podemos de alguna manera saber cuándo el usuario presiona y libera el FastScroller?

La reflexión te permite hacerlo. Al echar un vistazo al código fuente AbsListView , hay un objeto FastScroller que indica un envoltorio alrededor de la funcionalidad de desplazamiento rápido. Su código fuente muestra un campo interesante:

 /** * Current decoration state, one of: * <ul> * <li>{@link #STATE_NONE}, nothing visible * <li>{@link #STATE_VISIBLE}, showing track and thumb * <li>{@link #STATE_DRAGGING}, visible and showing preview * </ul> */ private int mState; 

Este campo contiene el estado del objeto FastScroller . La solución consiste en leer el valor de este campo mediante reflexión, cada vez que se onScroll() los onScroll() y onScrollStateChanged() .

Este código implementa la solución descrita anteriormente:

 private class CustomScrollListener implements OnScrollListener { private ListView list; private int mState = -1; private Field stateField = null; private Object mFastScroller; private int STATE_DRAGGING; public CustomScrollListener() { super(); String fastScrollFieldName = "mFastScroller"; // this has changed on Lollipop if (Build.VERSION.SDK_INT >= 21) { fastScrollFieldName = "mFastScroll"; } try { Field fastScrollerField = AbsListView.class.getDeclaredField(fastScrollFieldName); fastScrollerField.setAccessible(true); mFastScroller = fastScrollerField.get(list); Field stateDraggingField = mFastScroller.getClass().getDeclaredField("STATE_DRAGGING"); stateDraggingField.setAccessible(true); STATE_DRAGGING = stateDraggingField.getInt(mFastScroller); stateField = mFastScroller.getClass().getDeclaredField("mState"); stateField.setAccessible(true); mState = stateField.getInt(mFastScroller); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // update fast scroll state try { if (stateField != null) { mState = stateField.getInt(mFastScroller); } } catch (IllegalAccessException e) { e.printStackTrace(); } if (mState == STATE_DRAGGING)) { // the user is fast scrolling through the list } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // update fast scroll state try { if (stateField != null) { mState = stateField.getInt(mFastScroller); } } catch (IllegalAccessException e) { e.printStackTrace(); } } } 

Intente usar el setOnScrollListener e implemente el onScrollStateChanged. El scrollState puede estar inactivo, tocar scroll o fling

 setOnScrollListener(new OnScrollListener(){ public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub } public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub if(scrollState == 2) Log.i("a", "fast scroll"); } }); } 
  • Diferencias RelativeLayout entre 1,5 y 2,1
  • ¿Cómo puede inflar una presentación que contenga listview en un cuadro de diálogo de alerta?
  • Android - ListView extensible SetIndicatorBounds no funcionan en Kitkat android-4.4
  • Android: AmazingListView encabezado fijado es intocable
  • Diseño de filas ListView de Android ignorando el relleno
  • Tipface personalizado en android ListView con SimpleAdapter
  • ListView y elementos con temporizador de cuenta regresiva
  • Android ListView desplazamiento rápido con secciones: texto de sección demasiado largo
  • ¿Cómo puedo cambiar el color de fondo de una fila específica correctamente en un ListView? (Androide)
  • Listview - Pie de página en la parte inferior de la pantalla
  • Android ListView onTouchEvent no siempre da ACTION_DOWN
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.