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.