android scroll android-recyclerview smooth-scrolling gridlayoutmanager

android - (Suave) ScrollToPosition no funciona correctamente con RecyclerView



android-recyclerview smooth-scrolling (6)

¡Finalmente pude hacerlo funcionar! LinearLayoutManager.scrollToPositionWithOffset(int, int) hizo el truco.

Estoy usando RecyclerView básico con GridLayoutManager. Observé que ni smoothScrollToPosition ni scrollToPosition funcionan correctamente.

a) cuando uso smoothScrollToPosition menudo recibo un error de RecyclerView

"RecyclerView: Pasó por encima de la posición objetivo mientras se desplazaba suavemente".

y RecyclerView no se desplaza correctamente (a menudo pierde la fila de destino). Esto se observa principalmente cuando intento desplazarme al primer elemento de alguna fila

b) cuando uso scrollToPosition parece funcionar bastante bien, pero la mayoría de las veces solo puedo ver el primer elemento de la fila y el resto no se muestra.

¿Puede darme algunas pistas sobre cómo hacer que funcione correctamente al menos uno de los métodos?

¡Muchas gracias!


En mi caso,

`mRecyclerView.scrollToPosition(10);`

Tampoco funcionó. Pero

`mRecyclerView.smoothScrollToPosition(10);`

funciona bien para mi ...


Intente medir el ancho o la altura del elemento y llame a smoothScrollBy (int dx, int dy).


Llamar al recyclerView smoothScroll no es efectivo, ya que el recyclerView no maneja su diseño.

Lo que debes hacer es llamar al método de desplazamiento del administrador de diseño.

Esto debería verse algo como esto.

mRecyclerView.getLayoutManager().scrollToPosition(desiredPosition);


Para desplazarse hacia abajo desde cualquier posición en RecyclerView, haga clic en Editar texto.

edittext.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { rv_commentList.postDelayed(new Runnable() { @Override public void run() { rv_commentList.scrollToPosition(rv_commentList.getAdapter().getItemCount() - 1); } }, 1000); } });


También tengo el mismo problema, pero logré solucionar el problema mediante la personalización de SmoothScroller

deja Custom LayoutManager como abajo

public class CustomLayoutManager extends LinearLayoutManager { private static final float MILLISECONDS_PER_INCH = 50f; private Context mContext; public CustomLayoutManager(Context context) { super(context); mContext = context; } @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, final int position) { LinearSmoothScroller smoothScroller = new LinearSmoothScroller(mContext) { //This controls the direction in which smoothScroll looks //for your view @Override public PointF computeScrollVectorForPosition (int targetPosition) { return CustomLayoutManager.this .computeScrollVectorForPosition(targetPosition); } //This returns the milliseconds it takes to //scroll one pixel. @Override protected float calculateSpeedPerPixel (DisplayMetrics displayMetrics) { return MILLISECONDS_PER_INCH/displayMetrics.densityDpi; } }; smoothScroller.setTargetPosition(position); startSmoothScroll(smoothScroller); } }

(documentación comentada dentro del código dado arriba) Por favor, configure el LayoutManager anterior en la lista de reciclaje

CustomLayoutManagerlayoutManager = new CustomLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); recyclerView.smoothScrollToPosition(position);

utilizando el administrador de diseño personalizado

scrollToPosition también funciona bien en mi caso, puedes usar

recyclerView.scrollToPosition(position)

También, si desea ajustar la velocidad de smoothScrollToPosition, anule la

private static final float MILLISECONDS_PER_INCH = 50f;

en CustomLayoutManager. Entonces, si ponemos el valor como 1f, smoothScrollToPosition será más rápido como scrollToPosition. El aumento del valor hace que el retraso y la disminución hagan que la velocidad de desplazamiento. Espero que esto sea de utilidad.