web-dev-qa-db-fra.com

La pagination ne fonctionne pas pour RecyclerView dans NestedScrollView

Comment implémenter la pagination de recyclerview au sein de NestedScrollView

15
Jatin

Suivez ces étapes:

1. Définissez le défilement imbriqué activé sur false pour la vue Recycler.

recyclerView.setNestedScrollingEnabled(false);

2. Ajoutez le listner de défilement à la vue de défilement imbriquée.

 mScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
           @Override
           public void onScrollChanged()
           {
                    View view = (View)mScrollView.getChildAt(mScrollView.getChildCount() - 1);

                    int diff = (view.getBottom() - (mScrollView.getHeight() + mScrollView
                                    .getScrollY()));

                    if (diff == 0) {
                       // your pagination code
                    }
           }
  });
29
Vishva Dave

si vous utilisez Kotlin votre code ressemblera à

 scroll?.viewTreeObserver?.addOnScrollChangedListener {
        val view = scroll.getChildAt(scroll.childCount - 1)
        Timber.d("Count==============${scroll.childCount}")

        val diff = view.bottom - (scroll.height + scroll.scrollY)
        Timber.d("diff==============$diff")

        if (diff == 0) {
            //your api call to fetch data
        }
    }

et le dernier mais non le moindre set RecyclerView scrolling false

 ViewCompat.setNestedScrollingEnabled(recyclerView, false)
2
shahid17june

Je pouvais obtenir le paramètre de solution OnScrollChangeListener dans nestedScrollView.

Le champ isLoading doit être modifié chaque fois que vous chargez les éléments, par exemple si vous utilisez la modification. Vous pouvez le définir en tant que true avant de démarrer et false lorsque vous obtenez le response ou le failure.

Le champ isLastPage doit être modifié à chaque fois que vous obtenez des éléments et vérifiez si cette page était la dernière.

J'utilise Kotlin.

private var isLoading = false

private var isLastPage = false

nestedScrollView.setOnScrollChangeListener { v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->

            val nestedScrollView = checkNotNull(v){
                return@setOnScrollChangeListener
            }

            val lastChild = nestedScrollView.getChildAt(nestedScrollView.childCount - 1)

            if (lastChild != null) {

                if ((scrollY >= (lastChild.measuredHeight - nestedScrollView.measuredHeight)) && scrollY > oldScrollY && !isLoading && !isLastPage) {

                    //get more items
                }
            }
        }

Et bien sûr, vous devez définir le champ isNestedScrollingEnabled sur false

myRecyclerView.isNestedScrollingEnabled = false
0
jmarkstar