Android: onScrollStateChanged SCROLL_STATE_IDLE a veces no se dispara

Estoy teniendo un problema. Lo que estoy haciendo: Tengo un ListView que tiene algunas imágenes en él. Para hacer que el desplazamiento sea más suave, he inhabilitado las imágenes para que aparezcan al desplazarse. Ahora parece que hay un error en Android que a veces hace que el estado de desplazamiento no cambie de SCROLL_STATE_FLING a SCROLL_STATE_IDLE, lo que hace que mis imágenes no vuelvan a aparecer.

Mi primer pensamiento fue establecer un onTouchListener y comprobar cuando recibo ACTION_UP, pero eso no ayuda porque el estado SCROLL_STATE_FLING obviamente se está estableciendo después de eso. Así que ahora he pensado que podría iniciar un temporizador cuando el estado SCROLL_STATE_FLING se está estableciendo y comprobar después de algún tiempo si el estado sigue en modo de fling y, a continuación, invalidar mi vista. Pero no creo que sea una solución muy buena.

¿Alguien tiene una mejor idea de cómo podría hacer eso? He visto esta respuesta, pero necesito una solución para el nivel de API <9 (además de que también sucede a veces cuando no es overscrolling)

Aquí está mi código para eso:

mList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { mListAdapter.setIsScrolling(scrollState != SCROLL_STATE_IDLE); Log.i(this, "scrollStateChanged" + scrollState); if (scrollState == SCROLL_STATE_IDLE) { mList.invalidateViews(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); 

Gracias, Maria

Tuve el mismo problema, por lo que mi solución era detectar si la posición scrollview ha llegado a la última página y en ese caso siempre cargar las imágenes, independientemente del estado de desplazamiento (ya que el problema parece que siempre se producen cuando el usuario lanza hasta el final De la lista). Así que modificar el código que tendría:

 mList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { mListAdapter.setIsScrolling(scrollState != SCROLL_STATE_IDLE); Log.i(this, "scrollStateChanged" + scrollState); int first = view.getFirstVisiblePosition(); int count = view.getChildCount(); if (scrollState == SCROLL_STATE_IDLE || (first + count > mListAdapter.getCount()) ) { mList.invalidateViews(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); 

He tenido este mismo problema y publicado una solución en la lista de errores :

Para cualquier persona todavía que funciona en este problema (como era la semana pasada) una solución que funciona para mí es la siguiente: Si android SDKInt == 7 establecer un onTouchListener en el (Abs)ListView

En ese onTouchListener cuando la acción del evento MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL es MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL forzar un onScrollStateChanged con primero un SCROLL_STATE_FLING y luego un SCROLL_STATE_IDLE

Ejemplo de código: En el onCreate :

  if(androidSDKInt <= 7){ listViewDateSelector.setOnTouchListener(new FingerTracker(onScrollListener)); } 

A continuación, agregue una clase privada con:

  private class FingerTracker implements View.OnTouchListener { private OnScrollListener myOnScrollListener; public FingerTracker(OnScrollListener onScrollListener){ myOnScrollListener = onScrollListener; } public boolean onTouch(View view, MotionEvent event) { final int action = event.getAction(); boolean mFingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; if (mFingerUp) { myOnScrollListener.onScrollStateChanged((AbsListView) view, OnScrollListener.SCROLL_STATE_FLING); myOnScrollListener.onScrollStateChanged((AbsListView) view, OnScrollListener.SCROLL_STATE_IDLE); } return false; } } 
  • Retraso de desplazamiento con GestureDetector onScroll
  • Sin elástico Desplazamiento en ListView
  • ¿Hay alguna manera de saber cuántos elementos están mostrando en una vista de lista?
  • Desplazamiento automático de TextView en android para introducir texto en la vista
  • Desplazar RecyclerView para mostrar el elemento seleccionado en la parte superior
  • Desplazamiento en Horizontal ScrollView pierde el foco del elemento enfocado,
  • Android, appcompat v21, implementar técnicas de desplazamiento
  • Restablecer TextView vaya a la parte superior
  • Cómo usar la barra de desplazamiento y rápido Desplácese a NestedScrollView
  • Android: ViewPager y HorizontalScrollVIew
  • Desplazamiento suave en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.