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?

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 .

  • ArrayAdapter en Fragmento - Android
  • Mi listview no rellena el padre
  • ¿Cambiar el estado del CheckBox en el elemento de lista?
  • Resalte el efecto mientras presiona el elemento en el adaptador ListView personalizado
  • Android - EditTexts dentro de ListView vinculado a Custom ArrayAdapter - manteniendo un registro de los cambios
  • ¿Cuál usar WebView o TextView en una lista con datos HTML en ella?
  • Cómo establecer el color de fila alternativo de Listview y el color de fondo del elemento seleccionado
  • Uso de opengl para renderizar cada elemento en un listview en android
  • Cómo actualizar la matriz de elementos en una lista AlertDialog construida con AlertDialog.builder después de la creación
  • Android: AmazingListView encabezado fijado es intocable
  • Cómo agregar el diseño personalizado a Arrayadapter?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.