web-dev-qa-db-ja.com

NestedScrollView内のRecyclerViewでページネーションが機能しない

recyclerview内にあるNestedScrollViewのページネーションを実装する方法は?

16
Jatin

次の手順に従ってください:

1。リサイクラビューのネストされたスクロールを有効にするfalseを設定します。

recyclerView.setNestedScrollingEnabled(false);

2。スクロールリスナをネストされたスクロールビューに追加します。

 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
                    }
           }
  });
36
Vishva Dave

Kotlinを使用している場合、コードは次のようになります

 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
        }
    }

そして最後ではないが少なくとも RecyclerViewのスクロールをfalseに設定

 ViewCompat.setNestedScrollingEnabled(recyclerView, false)
3
shahid17june

OnScrollChangeListenernestedScrollViewを設定したソリューションを取得できました。

フィールドisLoadingは、たとえばレトロフィットを使用している場合など、アイテムをロードするたびに変更する必要があります。実行を開始する前にtrueとして設定し、falseまたはresponseを取得したときにfailureとして設定できます。

フィールドisLastPageは、アイテムを取得するたびに変更し、このページが最後のページであるかどうかを確認する必要があります。

私は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
                }
            }
        }

そしてもちろん、フィールドisNestedScrollingEnabledfalseとして設定する必要があります

myRecyclerView.isNestedScrollingEnabled = false
0
jmarkstar