分页不适用于 NestedScrollView 中的 RecyclerView

Pagination not work for the RecyclerView within NestedScrollView

如何在NestedScrollView内实现recyclerview的分页?

按照以下步骤操作:

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

如果您使用的是 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)

我可以在 nestedScrollView 中获得解决方案设置 OnScrollChangeListener

每次加载项目时都应更改字段 isLoading,例如,如果您正在使用改装。您可以在它开始 运行 之前将其设置为 true 并在获得 responsefailure.

时将其设置为 false

每次获取项目时都应更改字段 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
                }
            }
        }

当然你需要将字段 isNestedScrollingEnabled 设置为 false

myRecyclerView.isNestedScrollingEnabled = false

我遇到了同样的问题,基于 Android 文档:

Never add a RecyclerView or ListView to a scroll view. Doing so results in poor user interface performance and a poor user experience.

我使用下面的代码解决了我的问题:

<androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/coordinator_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<com.google.android.material.appbar.AppBarLayout
    android:id="@+id/appbar_layout"
    android:background="@color/white"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:titleEnabled="false">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <!-- Put here elements that you need above the recycler view -->

        </LinearLayout>

    </com.google.android.material.appbar.CollapsingToolbarLayout>

</com.google.android.material.appbar.AppBarLayout>
<!-- RecyclerView -->
<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:nestedScrollingEnabled="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:scrollbars="vertical"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>