分页不适用于 NestedScrollView 中的 RecyclerView

Posted

技术标签:

【中文标题】分页不适用于 NestedScrollView 中的 RecyclerView【英文标题】:Pagination not work for the RecyclerView within NestedScrollView 【发布时间】:2018-03-20 05:03:01 【问题描述】:

如何实现recyclerviewNestedScrollView内的分页?

【问题讨论】:

我尝试实现 recyclerview 的 addOnScrollListener 但每次将数据绑定到 recyclerview 时它都会调用。它应该只在页面结束时调用 【参考方案1】:

按照以下步骤:

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

【讨论】:

它一次调用所有分页 @Eldhopj 您的分页代码可能有问题。因为这对我来说很完美。 但是当我在 nestedscrollview 中使用 recyclerview 时,Recyclerview 变得很重 - 跳过帧。经过这么多滚动后,我的 RecyclerView 开始滞后。出现错误:跳过 186 帧!应用程序可能在其主线程上做了太多工作。我该如何解决这个问题? 嗨@user2162130 已禁用recyclerview 的滚动?当有两个滚动视图时,可能会发生这种情况。你需要禁用recyclerview的滚动 @VishvaDave 是的,我已经禁用了回收器视图的滚动,然后在回收器视图变得沉重和滞后之后。有时应用程序也会因此而崩溃。【参考方案2】:

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

【讨论】:

这对我不起作用,任何人都可以提供同样的帮助 @SrishtiRoy 你有没有尝试让recyclerview滚动为假?【参考方案3】:

我可以在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

【讨论】:

【参考方案4】:

我遇到了同样的问题,并且基于 android 文档:

永远不要将 RecyclerView 或 ListView 添加到滚动视图。这样做 导致糟糕的用户界面性能和糟糕的用户体验。

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

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

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

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:layout_
        android:layout_
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        app:titleEnabled="false">

        <LinearLayout
            android:layout_
            android:layout_
            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_
    android:layout_
    android:nestedScrollingEnabled="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    android:scrollbars="vertical"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

【讨论】:

以上是关于分页不适用于 NestedScrollView 中的 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

分页不适用于 POST 动作 laravel 5

分页列表不适用于具有多个模型的视图

Ext Js 分页不适用于 ExtDirect 网格面板

Ajax 请求不适用于数据表分页

readQuery 不适用于 Apollo 和 GraphQL 应用程序中的分页

过滤和分页不适用于 ngxpagination 模板