¿Existe alguna forma de saber cuánto ha desplazado un usuario en un recyclerView?
Mi pregunta se basa en mi objetivo actual de crear una barra de desplazamiento personalizada para desplazar varios tipos de vistas (en este momento, es un RecyclerView). Decidí intentar usar un SeekBar girado en lugar de varias ImageViews porque parecía más fácil de manipular y trabajar con él, además se ajusta a los límites del SeekBar, por lo que no se necesita código de límites por mi parte.
Lo configuré y basado en la investigación en la documentación y otros foros en línea, sabía que necesitaría saber qué tan lejos ha desplazado el usuario dividido por el rango máximo que el usuario puede desplazarse. Sin embargo, no sé cómo obtener estos valores de la manera más precisa posible. Al principio, intenté usar computeVerticalScrollOffset() / computeVerticalScrollRange() ya que parecía lógicamente correcto, pero no funcionó y siempre devuelve 0. También intenté hacer un seguimiento del valor sumando un onScrollListener al RecyclerView e incrementando un valor basado en el valor dy proporcionado por el método onScrolled() en ese listener… esto tampoco funcionó correctamente y fallaba muy a menudo, dependiendo del comportamiento de desplazamiento del usuario.
¿Hay alguna forma de obtener la distancia desplazada y la distancia máxima posible desplazable? Llevo intentando resolver esto (y el problema general de la barra de desplazamiento, para el cual esta es una solución) durante casi dos semanas y todas mis investigaciones han llevado a callejones sin salida. Agradecería mucho cualquier consejo o ayuda que alguien aquí pudiera ofrecer sobre esto.
davy.ai
Cómo obtener valores precisos para la distancia desplazada y la distancia máxima desplazable para una barra de desplazamiento personalizada?
Descripción del problema
El objetivo es crear una barra de desplazamiento personalizada para desplazar varios tipos de vistas, que incluye un RecyclerView. En lugar de utilizar varias ImageViews, se utiliza un SeekBar rotado ya que es más fácil de manipular y se ajusta a los límites del SeekBar. Sin embargo, no se obtienen de manera precisa los valores de la distancia desplazada y la distancia máxima desplazable utilizando los métodos computeVerticalScrollOffset() y computeVerticalScrollRange() o un onScrollListener para el RecyclerView. Se requiere una solución para obtener estos valores de manera precisa.
Solución
Solución 1: Sobrescribir los métodos computeVerticalScrollOffset() y computeVerticalScrollRange()
Como los métodos computeVerticalScrollOffset() y computeVerticalScrollRange() no funcionaron, podrías sobrescribir estos métodos en tu clase RecyclerView para devolver los valores correctos.
Solución 2: Utilizar un RecyclerViewScrollListener personalizado para rastrear la distancia de desplazamiento
Para rastrear con precisión la distancia de desplazamiento, crea un RecyclerViewScrollListener personalizado, extendiendo la clase RecyclerView.OnScrollListener, y rastrea el valor dy proporcionado por el método onScrolled().
Luego puedes agregar este listener a tu RecyclerView y obtener el valor totalDy para obtener la distancia desplazada actual.
Solución 3: Utilizar el ViewTreeObserver para obtener la distancia máxima desplazable
Para obtener la distancia máxima desplazable, podrías utilizar el ViewTreeObserver para obtener la altura del RecyclerView y la altura del contenido que se va a mostrar, y luego calcular la distancia máxima desplazable en función de la diferencia entre las dos alturas.
Conclusión
Existen varias formas de obtener valores precisos para la distancia desplazada y la distancia máxima desplazable para una barra de desplazamiento personalizada. Puedes sobrescribir los métodos computeVerticalScrollOffset() y computeVerticalScrollRange(), utilizar un RecyclerViewScrollListener personalizado o utilizar el ViewTreeObserver para obtener la distancia máxima desplazable.