web-dev-qa-db-fra.com

Recyclerview onscrolllistener ne fonctionne pas lorsque setNestedScrollingEnabled est défini sur false

Je veux implémenter la pagination avec recyclerView, pour cela j'ajoute addOnScrollListener à la recyclerView mais j'ai des problèmes avec RecyclerView.OnScrollListener qui ne fonctionne pas lorsque je règle rvGridExplore.setNestedScrollingEnabled(false); 

Mais lorsque je supprime rvGridExplore.setNestedScrollingEnabled(false);, cela fonctionne bien, Je ne sais pas comment gérer cela.

Voici le code:

rvGridExplore = (RecyclerView) view.findViewById(R.id.rvGridExplore);
        final GridLayoutManager glm = new GridLayoutManager(context,2);
       // rvGridExplore.setNestedScrollingEnabled(false);
        rvGridExplore.setLayoutManager(glm);

       // final int visibleItemCount,totalCount,pastVisibleItems;
        rvGridExplore.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                Log.v("scrollll","state changed");
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy > 0) {
                    int totalCount = glm.getItemCount();
                    int visibleItemCount = glm.getChildCount();
                    int pastVisibleItems = glm.findFirstVisibleItemPosition();
                    if (loading) {
                        if ((visibleItemCount + pastVisibleItems) >= totalCount) {
                            Log.v("scroll","scrolled"+pastVisibleItems);
                        }
                    }

                }
            }
        });
9
Adnan Ali

Cette question est peut-être ancienne, mais pour aider les autres qui sont tombés sur ce problème, j'aimerais partager ce que j'ai fait. J'ai dû implémenter onScroll Listener avec recyclerview pour charger des données à partir du serveur et apporter des modifications à l'interface utilisateur. Et également besoin de swipeRefresh Layout pour actualiser les données.

C'était ma structure de fichier xml,

-RelativeLayout

 -SwipeRefreshLayout

  -NestedScrollView

   -LinearLayout(Vertical)

    -Multiple views required

Ensuite, pour détecter le défilement ascendant et descendant, j’implémentais setOnScrollListener dans NestedScrollView.

Utilisation normale de SwipeRefreshLayout pour actualiser les données.

Et pour charger plus de données, j'ai implémenté la logique dans onScrollListener de NestedScrollingView.

if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {

    // Load More Data
}
5
m.n Aswin

supprimez la vue de défilement imbriquée, utilisez une disposition linéaire ou relative à la place de celle-ci en tant qu'élément racine; vous pouvez alors écrire recyclerview.setNestedScrollEnabled (false); 

0
faisal waris

Étape 1: créez EndlessRecyclerOnScrollListener

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();

    // use your LayoutManager instead
    private LinearLayoutManager llm;

    public EndlessRecyclerOnScrollListener(LinearLayoutManager sglm) {
        this.llm = llm;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if (!recyclerView.canScrollVertically(1)) {
            onScrolledToEnd();
        }
    }

    public abstract void onScrolledToEnd();
}

Étape 2: appliquez un écouteur de défilement à la vue du recycleur.

recyclerview.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
            @Override
            public void onScrolledToEnd() {
                Log.e("Position", "Last item reached");
                if (loadMore == true) {
                    // put your Load more code
                    // add 10 by 10 to tempList then notify changing in data
                }
            }
        });
0

Vous avez dit dans un commentaire à votre question "
il est sous NestedScrollView qui est sous la disposition du coordinateur, si je supprime ceci, la barre d’outils ne défile pas ". C’est une erreur.

J'ai constaté que vous ne pouvez pas avoir les deux manières, le comportement CoordinatorLayout s'interrompt lorsque vous avez une variable RecyclerView dans une variable NestedScrollView à laquelle vous avez ajouté le comportement. Vous devez utiliser l'un ou l'autre.

Lorsque vous avez une RecyclerView dans une NestedScrollView, cela fonctionnera tant que vous définissez RecyclerView.setNestedScrollingEnabled(false), mais comme vous l'avez découvert, cela signifie que la OnScrollListener n'est pas appelée.

Pour que tous les composants fonctionnent correctement, le seul moyen consiste à supprimer la variable NestedScrollView et à vous assurer que ne définissez pas le défilement imbriqué sur false et que vous travailliez à partir de là. Sinon, les événements RecyclerView.OnScrollListener ne se déclencheront pas correctement.

0
r3flss ExlUtr

Ne ajoutez setOnScrollChangeListner à votre NestedScrollView

 nestedScrollview.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {
               if(loading)
                onClick();
               loading=false;
            }
        }
    });

après le chargement des données du serveur, définissez boolean loading = true.

0
Harish Reddy