Red de conocimiento informático - Conocimiento informático - Cómo obtener la distancia de deslizamiento de Android RecyclerView

Cómo obtener la distancia de deslizamiento de Android RecyclerView

1. Utilice OnScrollListener

[java] ver copia simple

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

private int totalDy = 0;

@Override

public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

totalDy -= dy;

})

});

Como se describe en el código, totalDy guarda la distancia de deslizamiento de RecyclerView, pero cuando deslizo RecyclerView hacia abajo e inserto/elimino/muevo elementos después de deslizarlo, totalDy se vuelve inexacto; por ejemplo, si elimino o inserto un elemento nuevo, totalDy ya no puede volver a 0.

1. Escuche addOnScrollListener de RecyclerView y registre onScrolled dy usted mismo. Al mismo tiempo, agregue RegisterAdapterDataObserver para el adaptador, escuche la inserción/eliminación/movimiento y agregue o reste el valor de desplazamiento de dy usted mismo. No lo he probado yo mismo, ¡así que no sé si funciona!

2. Algunas personas dicen que puedes probar computeVerticalScrollOffset()

[java] ver copia simple

totalDy = recyclerView.computeVerticalScrollOffset();

Sin embargo, el método de cálculo no calcula la distancia exacta de la diapositiva. Hay una respuesta en stackOverflow que lo explica como la altura promedio de los elementos * el número de elementos visibles, que no es el exacto. distancia que necesitamos.

3. Otros dicen que puedes probar getChildAt(0)

[java] ver copia simple

totalDy = recyclerView.getChildAt(0).getTop(). ;

Esto depende de la distancia de deslizamiento del primer elemento a la animación, pero el totalDy derivado de este método se borrará después de deslizarse una cierta cantidad.

Esto se debe a que recyclerViewl.getChildAt(0) siempre devuelve el primer hijo visible, no el primer hijo en la lista de todas las vistas, por lo que no se puede obtener la distancia de deslizamiento de esta manera.

Además, los siguientes tres usos son equivalentes y todos pueden obtener la primera subvista visible:

[java] Ver copia ordinaria

LinearLayoutManager layoutManager = ( LinearLayoutManager) this.getLayoutManager();

Ver firstVisiableChildView = this.getChildAt(0);

Ver firstVisiableChildView = layoutManager.

Ver firstVisiableChildView = layoutManager.getChildAt ( 0)

Int position = layoutManager.findFirstVisibleItemPosition();

Ver firstVisiableChildView = layoutManager.getChildAt( position)

Pero el siguiente método no. No puede obtener el primer hijo visible, solo puede obtener el primer hijo en la lista de todas las vistas, pero siempre devuelve un valor nulo después de deslizarse una cierta distancia, es decir,

[java] ver copia simple

//No utilice esta función para obtener el primer elemento; cuando el primer elemento se recicle, devolverá un valor nulo.

LinearLayoutManager layoutManager = (LinearLayoutManager) this.getLayoutManager();

View child2 = layoutManager.findViewByPosition(0);

4. , se recomienda encarecidamente utilizar el siguiente método para obtener la distancia de deslizamiento:

[java] ver copia simple

public int getScollYDistance() {

LinearLayoutManager layoutManager = (LinearLayoutManager) this.findFirstVisibleItemPosition();

Ver firstVisiableChildView = layoutManager.findViewByPosition(posición);

int itemHeight = firstVisiableChildView.getHeight(); >return (posición) * itemHeight - firstVisiableChildView.getTop()

}