Detener la animación de desplazamiento ListView

Tengo un ListView con cerca de 100 entradas. Cuando el usuario hace el "fling" de abajo hacia arriba empieza a desplazarse y sigue desplazándose incluso cuando el dedo no toca la pantalla más.

¿Hay una manera de detener la animación de desplazamiento en este punto?

5 Solutions collect form web for “Detener la animación de desplazamiento ListView”

Bueno, seguramente hay una manera de hacerlo. Pero el punto es más si o no es aconsejable hacerlo, en mi opinión.

La lista es un control estándar de Android que se comporta de forma consistente en todas las aplicaciones. Así que me sorprendería si encontré una lista que no se comportó igual en su aplicación. Puede detener el vuelo poniendo el dedo en la pantalla en cualquier momento.

Dicho esto, si desea hacer un trabajo extra, podría subclase la vista de lista y anular su método de toque. La mejor manera de saber qué hacer es obtener el código fuente de ListView ( ListView en Android 1.6 ).

y buscamos el código fuente de Android (AbsListView), le damos un ACTION_CANCEL touchEvent, podemos detener el fling. es fácil.

 listView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_CANCEL, 0, 0, 0)); 

No probé la solución de Pompe de velo pero ya que smoothScrollToPosition() no está disponible para el nivel de API inferior a 8, esto no funcionó para mí.

Estoy de acuerdo, cambiar el comportamiento por defecto no es una buena idea, pero a veces es necesario. Así que aquí está mi solución (sucia) que utiliza la reflexión. Esto no es por mucho el camino recomendado ya que es un hack, pero funciona para mí. Podría haber una solución mejor, pero no lo encontré.

 class StopListFling { private static Field mFlingEndField = null; private static Method mFlingEndMethod = null; static { try { mFlingEndField = AbsListView.class.getDeclaredField("mFlingRunnable"); mFlingEndField.setAccessible(true); mFlingEndMethod = mFlingEndField.getType().getDeclaredMethod("endFling"); mFlingEndMethod.setAccessible(true); } catch (Exception e) { mFlingEndMethod = null; } } public static void stop(ListView list) { if (mFlingEndMethod != null) { try { mFlingEndMethod.invoke(mFlingEndField.get(list)); } catch (Exception e) { } } } } 

Puede evitar el lanzamiento de ListViews en la API 8 mediante la sustitución de onTouchEvent y la llamada a smoothScrollBy.

 @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: this.smoothScrollBy(0, 0); break; } return super.onTouchEvent(ev); } 

Esto toma el control del desplazamiento fling y se desplaza 0px en su lugar.

Mi opinión es que no debe modificar este comportamiento, ya que el comportamiento de fling es lo que el usuario espera.

Sin embargo, a su pregunta. No he probado esto, pero en teoría debería funcionar.

Implementar un OnScrollListener a su ListView y utilizar el método onScrollStateChanged() para comprobar si el estado actual es SCROLL_STATE_FLING . Una vez que hayas determinado que el desplazamiento realiza un fling puedes obtener la primera posición visible de tu ListView usando el método getFirstVisiblePosition() y desde allí puedes usar smoothScrollToPosition() donde getFirstVisiblePosition() tu valor getFirstVisiblePosition() como argumento .

  • Lista de elementos con colores alternos
  • Android: Problemas con ListViews y CheckBoxes
  • El efecto Ripple no va por encima de ImageView
  • Cómo obtener los elementos de la lista seleccionada de un Listview con checkBox y Adaptador personalizado?
  • Vistas de varias listas de Android que no se desplazan de forma independiente
  • Android: Cómo ocultar un elemento ListView
  • Android: Pie de página en un ListView
  • Cómo poner los elementos de la lista en la parte inferior de la vista de lista en el Cajón de navegación como Foursquare
  • SwapCursor undefined error
  • Encabezado de listview de Android
  • El botón de acción flotante no funciona sobre ListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.