En un RecyclerView, puedo desplazarme repentinamente a la parte superior de un elemento seleccionado usando:
((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(position, 0);
Sin embargo, esto mueve abruptamente el artículo a la posición superior. Quiero pasar a la parte superior de un elemento sin problemas .
También he intentado:
recyclerView.smoothScrollToPosition(position);
pero no funciona bien, ya que no mueve el elemento a la posición seleccionada en la parte superior. Simplemente desplaza la lista hasta que el elemento en la posición sea visible.
protected int getHorizontalSnapPreference() { return LinearSmoothScroller.SNAP_TO_START; }
. Además, tuve que implementar el método abstractopublic PointF computeScrollVectorForPosition(int targetPosition) { return layoutManager.computeScrollVectorForPosition(targetPosition); }
.para esto tienes que crear un LayoutManager personalizado
use esto para su RecyclerView y llame a smoothScrollToPosition.
ejemplo:
esto se desplazará hasta la parte superior del elemento RecyclerView de la posición especificada.
espero que esto ayude.
fuente
smoothScrollToPosition
. ¿Por qué puede ocurrir este problema? Gracias.Esta es una función de extensión que escribí en Kotlin para usar con
RecyclerView
(basada en la respuesta de @Paul Woitaschek):Úselo así:
fuente
Podemos intentar así
fuente
Anule la función CalculateDyToMakeVisible / CalculateDxToMakeVisible en LinearSmoothScroller para implementar la posición de desplazamiento Y / X
fuente
La forma más fácil que he encontrado para desplazar a
RecyclerView
es la siguiente:fuente
Solía así:
fuente
Gracias, @droidev por la solución. Si alguien busca la solución de Kotlin, consulte esto:
fuente
CustomLinearLayout.kt:
Nota: El ejemplo anterior está configurado en dirección HORIZONTAL, puede pasar VERTICAL / HORIZONTAL durante la inicialización.
Si establece la dirección en VERTICAL , debe cambiar el " CalculateDxToMakeVisible " a " CalculateDyToMakeVisible " (también tenga en cuenta el valor de retorno de la llamada de supertipo)
Activity / Fragment.kt :
fuente
Probablemente el enfoque @droidev sea el correcto, pero solo quiero publicar algo un poco diferente, que básicamente hace el mismo trabajo y no requiere la extensión del LayoutManager.
Una NOTA aquí: esto funcionará bien si su elemento (el que desea desplazar en la parte superior de la lista) está visible en la pantalla y solo desea desplazarlo hacia la parte superior automáticamente. Es útil cuando el último elemento de su lista tiene alguna acción, que agrega nuevos elementos en la misma lista y desea enfocar al usuario en los nuevos elementos agregados:
La idea es simple: 1. Necesitamos obtener la coordenada superior del elemento de vista del reciclador; 2. Necesitamos obtener la coordenada superior del elemento de vista que queremos desplazar hacia arriba; 3. Al final con el desplazamiento calculado tenemos que hacer
200 es solo un valor entero codificado de ejemplo que puede usar si el elemento del marcador no existe, porque eso también es posible.
fuente
Quiero abordar más a fondo el problema de la duración del desplazamiento , que, si elige cualquier respuesta anterior, de hecho variará dramáticamente (e inaceptablemente) de acuerdo con la cantidad de desplazamiento necesario para alcanzar la posición objetivo desde la posición actual.
Para obtener una duración de desplazamiento uniforme, la velocidad (píxeles por milisegundo) debe tener en cuenta el tamaño de cada elemento individual, y cuando los elementos son de dimensión no estándar, se agrega un nuevo nivel de complejidad.
Esta puede ser la razón por la cual los desarrolladores de RecyclerView implementaron la canasta demasiado dura para este aspecto vital del desplazamiento suave.
Suponiendo que desea una duración de desplazamiento semi uniforme y que su lista contiene elementos semi uniformes , necesitará algo como esto.
PD: Maldigo el día que comencé a convertir indiscriminadamente ListView a RecyclerView .
fuente
Puede revertir su lista
list.reverse()
y finalmente llamarRecylerView.scrollToPosition(0)
fuente