android - RecyclerView ScrollListener dentro de NestedScrollView
android-recyclerview infinite-scroll (2)
Para lograr un desplazamiento sin fin para la vista de reciclador que está bajo NestedScrollView, puede usar "NestedScrollView.OnScrollChangeListener"
nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
if(v.getChildAt(v.getChildCount() - 1) != null) {
if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) &&
scrollY > oldScrollY) {
//code to fetch more data for endless scrolling
}
}
});
Aquí v.getChildCount() -1
debería proporcionarle la vista de reciclador para la cual está implementando un desplazamiento sin fin.
También scrollY > oldScrollY
confirma que la página se está desplazando hacia abajo.
Referencia: NestedScrollView.OnScrollChangeListener
Tengo un EndlessRecyclerView
al final de un NestedScrollView
. EndlessRecyclerView
significa: cuando el usuario se desplaza a la parte inferior del recyclerView, carga más datos. Esto ya está implementado y funciona en otro lugar, pero cuando coloco el recyclerView dentro de NestedScrollView
los eventos OnScrollListener
no se OnScrollListener
.
Diseño XML:
<NestedScrollView>
<Other views/>
<EndlessRecyclerView/>
</NestedScrollView >
Código:
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// This is never fired! Here is where I implement the logic of EndlessRecyclerView
}
});
¿Cómo obtengo el evento de desplazamiento para el caso anterior?
Sé que no es bueno tener dos vistas desplazables una dentro de la otra. Pero, ¿cómo tengo el caso anterior sin tener dos vistas desplazables?
Ya he seguido este enlace pero no funciona: evento de desplazamiento para recyclerview dentro de scrollview para Android
Tuve un problema similar, aunque era un poco diferente. En mi caso, tuve una vista de reciclaje dentro de un fragmento mientras que NestedScrollView estaba en el content_main xml (parte de la actividad).
Envolví mi reciclaje que estaba dentro del fragmento con SwipeRefreshLayout
Este es el código de mi fragmento:
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_dummy"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/top_series_recycle_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
Lo único que queda por hacer es deshabilitar SwipeRefreshLayout desde el código
mSwipeLayout.isEnabled = false
Si no lo haces, al deslizar hacia abajo se mostrará un icono de actualización interminable. Quería compartir esta solución en caso de que alguien necesite esta funcionalidad o tenga este problema también
Después de envolver el reciclaje con un SwipeRefreshLayout, verás addOnScrollListener de recycleview se llamará como siempre