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 .

  • ¿Hay una manera fácil de arrastrar elementos en un ListView para cambiar su orden?
  • Cómo cambiar el modo de selección ListView de solo a múltiple al hacer clic en evento en android?
  • Los elementos ListView y de altura variable provocan problemas de desplazamiento
  • aplicación de gmail para Android como las conversaciones
  • Android ListView cuando los elementos se pueden enfocar, deshabilita los clics
  • cómo filtrar el listview personalizado en android
  • Android Handler Message y ListView
  • Listview / ExpandableListVer imágenes de contenido cuando se llama notifyDataSetChanged
  • Los elementos listView desaparecen en desplazamiento para android 2.3
  • Estilos / atributos de divisor predeterminados de ListView de Android
  • Listview addFooterView problemas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.