web-dev-qa-db-fra.com

RecyclerView ScrollListener dans NestedScrollView

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

21
Damia Fuentes

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

44
Govind

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

0
Anton Makov