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

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.

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:

  1. 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 de flinging , smoothscroll el LinearLayoutManager a una posición.
  2. 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étodo onTouchEvent .

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:

  1. 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.

  2. 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 correctamente getItemPosition(Object object) y devolver POSITION_NONE para los elementos que han cambiado y devolver POSITION_UNCHANGED o la posición real para los elementos que no han cambiado.

  3. Otro API que se agregó es setPageMargin() y setPageMarginDrawable() , 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 :

  1. ItemTouchHelper , que es una clase de utilidad para agregar swipe a descartar y arrastrar y soltar apoyo a RecyclerView.

  2. Su ItemTouchHelper.Callback , que es el contrato entre ItemTouchHelper y su aplicación

Para fling puedes ver

  1. Android acciones de fling en un RecyclerView

  2. 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.

  • Fragmento dinámico de Android Google Maps en el soporte de RecyclerView
  • Deshabilitar haga clic en RecyclerView dentro de un SwipeRefreshLayout
  • Rendimiento extremadamente Laggy RecyclerView
  • Mostrar datos SQLite en RecyclerView
  • Cómo implementar filtrado en RealmRecyclerViewAdapter
  • recyclerView.getChildCount () devuelve un número diferente de niños cada vez
  • Error: no se puede encontrar la clase de símbolo RecyclerView
  • ¿Cómo usar la API fluida de MvvmCross para enlazar TextView de un elemento de RecyclerView a una propiedad de su ViewModel en Android?
  • GetAdapterPosition () no devuelve la posición del elemento en RecyclerView
  • ¿Que es mejor? NotifyDataSetChanged o notifyItemChanged en el bucle?
  • Barra de herramientas dejando espacio en blanco con ocultar en RecyclerView scroll
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.