J'ai un EndlessRecyclerView
à la fin d'un NestedScrollView
. EndlessRecyclerView
signifie: lorsque l'utilisateur fait défiler vers le bas de recyclerView, il charge plus de données. Ceci est déjà implémenté et fonctionne ailleurs mais quand je mets recyclerView à l'intérieur de NestedScrollView
les événements OnScrollListener
ne se déclenchent pas.
Conception XML:
<NestedScrollView>
<Other views/>
<EndlessRecyclerView/>
</NestedScrollView >
Code:
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
}
});
Comment puis-je obtenir un événement de défilement pour le cas ci-dessus?
Je sais que ce n'est pas bon d'avoir deux vues défilables l'une dans l'autre. Mais, comment puis-je avoir le cas ci-dessus sans avoir deux vues déroulantes?
J'ai déjà suivi ce lien mais cela ne fonctionne pas: événement de défilement pour recyclerview dans scrollview Android
Pour obtenir un défilement sans fin pour la vue du recycleur qui se trouve sous NestedScrollView, vous pouvez utiliser "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
}
}
});
Ici, v.getChildCount() -1
devrait vous donner la vue du recycleur pour laquelle vous implémentez un défilement sans fin.
scrollY > oldScrollY
Confirme également que la page défile.
Référence: NestedScrollView.OnScrollChangeListener
J'ai eu un problème similaire, bien qu'il soit un peu différent. Dans mon cas, j'avais une recycleview dans un fragment alors que le NestedScrollView était dans le XML content_main (une partie de l'activité).
J'ai enveloppé ma vue de recyclage qui était dans le fragment avec SwipeRefreshLayout
Voici le code de mon fragment:
<?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>
La seule chose qui reste à faire est de désactiver le SwipeRefreshLayout du code
mSwipeLayout.isEnabled = false
Si vous ne le faites pas, lorsque vous glissez vers le bas, une icône de rafraîchissement sans fin s'affiche. Je voulais partager cette solution au cas où quelqu'un aurait besoin de cette fonctionnalité ou aurait également ce problème
Après avoir encapsulé la vue de recyclage avec un SwipeRefreshLayout, vous verrez que addOnScrollListener de la vue de recyclage sera appelé comme d'habitude