Diferenciar entre una acción de Drag y una acción de Fling en recyclerview
Recyclerview ahora tiene 3 estados.
SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
- RecyclerView: java.lang.IndexOutOfBoundsException: Inconsistencia detectada. Posición de artículo no válida
- Prueba recyclerView con Espresso, cómo realizar clics o hacer afirmaciones
- ¿Hay alguna manera de mostrar Google Admob en Android Recycler View
- Los fragmentos ViewPager hacen referencia al mismo RecyclerView y / o Adapter
- Cómo implementar correctamente un adaptador para un ListView
Un problema planteado para que el mismo incluya un estado de fling. No puedo determinar si se hizo algo con respecto a esto.
¿Hay una manera de diferenciar entre un Drag y un Fling en recyclerview.
EDIT : El requisito de dicha funcionalidad: Cuando el usuario lance, quiero poder hacer una pausa de carga de imágenes (todas las imágenes son solicitudes de url) en la vista de reciclador y reanudar una vez que llega a un elemento de interés, asegurando así que la imagen que es Actualmente viendo cargas antes que las otras.
- Cómo saltar la primera fila en RecyclerView elemento de decoración para GridLayout?
- Los datos de Firebase no se muestran en RecyclerView
- FirebaseRecyclerAdapter con vista vacía
- Android Visualización de datos de json a cardview en RecyclerView
- Cómo usar el mismo Adaptador RecyclerView para diferentes diseños
- ¿Debo cambiar el Listview existente en mi aplicación a RecyclerView?
- RecyclerView con el índice del alfabeto
- RecyclerView.onBindViewHolder sólo se llama una vez
SCROLL_STATE_FLING
: Ya no es parte de RecyclerView
ya que no se menciona en la documentación aquí
En cuanto a su requisito :
RecyclerView está dentro de android.view.ViewGroup
y según su código fuente extends ViewGroup
documentación de extends ViewGroup
aquí .
El desplazamiento en un RecyclerView es una especie de división entre el RecyclerView y el LinearLayoutManager. Hay dos casos que necesitaba manejar:
- El usuario arroja la vista. El comportamiento predeterminado es que el RecyclerView pasa el fling a un Scroller interno que luego realiza la magia de desplazamiento. Esto es problemático porque entonces el RecyclerView se instala generalmente en una posición unsnapped. Resuelve esto reemplazando la implementación de RecyclerView
fling()
y en lugar deflinging
,smoothscroll
elLinearLayoutManager
a una posición. - El usuario levanta el dedo con velocidad insuficiente para iniciar un desplazamiento. En este caso no se produce ningún ataque. Si desea detectar este caso en el caso de que la vista no esté en una posición
onTouchEvent
, puede hacerlo sobrescribiendo el métodoonTouchEvent
.
Vea aquí para más detalles Desplazamiento rápido en RecyclerView
Algunos consejos de ViewPager
que vale la pena mencionar como RecyclerView
es un hijo de ella:
-
Piense en modificar el número de páginas que se almacenan en caché. Esto es especialmente importante cuando sólo tiene 3 o 4 páginas. El ajuste predeterminado almacenará 1 página a cada lado de la página actual. En el escenario en el que tiene 3 páginas, pasar a la página del medio significará que todas sus páginas se almacenarán en caché. Luego, pasando a la primera o última página, se eliminará una de las páginas de la memoria y será necesario recrearlas y volver a agregarlas cuando retrocedas de nuevo. Al establecer
setOffscreenPageLimit(2)
, permitirá que todas sus páginas permanezcan en la memoria todo el tiempo. Se trata de un compromiso entre el rendimiento y las consideraciones de memoria, por lo que es una buena idea escuchar las advertencias de memoria baja y estar preparado para eliminar las páginas de borde si es necesario. -
Si está intentando reemplazar Views en su ViewPager, no basta con cambiar el conjunto de datos detrás del adaptador y llamar a
notifyDataSetChanged()
. También debe asegurarse de que ha implementado correctamentegetItemPosition(Object object)
y devolverPOSITION_NONE
para los elementos que han cambiado y devolverPOSITION_UNCHANGED
o la posición real para los elementos que no han cambiado. -
Otro API que se agregó es
setPageMargin()
ysetPageMarginDrawable()
, lo que le permite separar fácilmente sus páginas.
Vea aquí para más detalles Vista horizontal Balanceo con ViewPager, Actualizado
Diferencia entre una arrastrar y un Fling
Para la función de arrastrar Puede utilizar algunas de las clases complementarias RecyclerView's
:
-
ItemTouchHelper , que es una clase de utilidad para agregar swipe a descartar y arrastrar y soltar apoyo a RecyclerView.
-
Su ItemTouchHelper.Callback , que es el contrato entre ItemTouchHelper y su aplicación
Para fling puedes ver
-
Android acciones de fling en un RecyclerView
-
Android: Control Desplazamiento suave sobre la vista del reciclador
Utilizo una combinación de SCROLL_STATE_DRAGGING, SCROLL_STATE_SETTLING
para hacer esto: aquí está mi código:
@Override public void onScrollStateChanged(int newState) { if (newState == RecyclerView.SCROLL_STATE_DRAGGING || newState == RecyclerView.SCROLL_STATE_SETTLING) { if (mAdapter != null) mAdapter.pauseImageLoading(); } else if (newState == RecyclerView.SCROLL_STATE_IDLE) { if (mAdapter != null) mAdapter.resumeImageLoading(); }
Esto funciona para mí lo mismo que usted quiere que reanudar cuando el usuario detener en el tema de interés
Su problema podría ser potencialmente resuelto de una manera diferente. Usted podría tratar de aplazar sus peticiones en un par de cientos de milisegundos (el número exacto tendría que ser ajustado). Si el elemento de lista se desplaza fuera de la pantalla dentro de esos milisegundos, puede cancelar la solicitud antes de enviarla. La idea es que si te lanzas, las vistas se despliegan fuera de la pantalla tan rápidamente que las solicitudes siempre se cancelarán antes de que se envíen. Si no son flinging, los milisegundos extras por solicitud, esperemos que no es demasiado malo de una experiencia.