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.
- Haga que las pestañas de ActionBar se desplacen cuando alcance límite, en lugar de crear una lista desplegable
- Android: FastScrolling SectionIndexer getSections () se llama sólo una vez
- Recogida de basura GridView de Android (GC_EXTERNAL_ALLOC) <1K excesivamente, causando una interfaz de usuario muy intermitente
- Desplazamiento del índice de Android
- Android smoothScrollTo no invocando onScrollStateChanged
¿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
- Android, LinearLayout no se desplaza
- Desbordamiento: elementos de desplazamiento en android y desplazamiento nativo, -webkit-overflow-scrolling: touch
- Android ListView - detiene el desplazamiento en la posición de fila 'completa'
- Android WebView dentro de ScrollView solo desplaza scrollview
- Obtener el elemento visible en el centro de RecycleView al desplazarse
- Webview no desplazamiento después de agregar setOnTouchListener
- Android se desplaza hasta la parte inferior de una vista de lista
- ¿Cómo puedo desplazar un WebView a un punto específico en Android
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 eventoMotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
esMotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL
forzar unonScrollStateChanged
con primero unSCROLL_STATE_FLING
y luego unSCROLL_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; } }
- Cambiar de AndEngine a libgdx – qué saber?
- Cómo configurar diferentes temas para el diseño hinchado en un talón de vista