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 .

  • Android añadiendo pie de página a ListView addFooterView ()?
  • Android: Obtiene el elemento listview del botón que se hace clic en la vista de lista personalizada
  • Cómo implementar Android listview apertura gesto
  • Crear listview en el fragmento android
  • ¿Mi proceso de almacenamiento en caché de imágenes va a perder memoria?
  • ¿Cómo puedo añadir una vista de pie de página a una lista secundaria en una lista de extensibilidadListActivity?
  • Uso del adaptador ListView personalizado con los temas predeterminados de Android
  • Android: lista clara en Listadapter
  • Cómo actualizar el ListView en lista de arrastre de ListView?
  • AbsListView unregisterIRListener () se llama
  • ¿Cómo hacer el desplazamiento de ListView más lento cuando se utiliza la función smoothScrollToPosition ()?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.