40

EndlessRecyclerView在 a 的末尾有一个NestedScrollViewEndlessRecyclerView意思是:当用户滚动到 recyclerView 的底部时,它会加载更多数据。这已经实现并在其他地方工作,但是当我将 recyclerView 放入NestedScrollView事件时OnScrollListener不会触发。

XML设计:

<NestedScrollView>

     <Other views/>

     <EndlessRecyclerView/>

</NestedScrollView >

代码:

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            // This is never fired! Here is where I implement the logic of EndlessRecyclerView
        }
    });

如何获得上述情况的滚动事件?

我知道在彼此内部有两个可滚动视图是不好的。但是,我如何在没有两个可滚动视图的情况下拥有上述情况?

我已经关注了这个链接,但它不起作用:scrollview android 内的 recyclerview 的滚动事件

4

4 回答 4

96

要实现 NestedScrollView 下的回收器视图的无限滚动,您可以使用“NestedScrollView.OnScrollChangeListener”

nestedScrollView.setOnScrollChangeListener((NestedScrollView.OnScrollChangeListener) (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
            if(v.getChildAt(v.getChildCount() - 1) != null) {
                if ((scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight())) &&
                        scrollY > oldScrollY) {
                        //code to fetch more data for endless scrolling
                }
            }
        });

这里v.getChildCount() -1应该给你实现无限滚动的回收器视图。

scrollY > oldScrollY确认页面正在向下滚动。

参考:NestedScrollView.OnScrollChangeListener

于 2016-12-21T12:14:24.460 回答
3
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener()
{
    @Override
    public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY)
    {
       if (v.getChildAt(v.getChildCount() - 1) != null)
       {
          if (scrollY > oldScrollY)
          {
             if (scrollY >= (v.getChildAt(v.getChildCount() - 1).getMeasuredHeight() - v.getMeasuredHeight()))
             {
                //code to fetch more data for endless scrolling
             }
          }
       }
    }
 });
于 2020-11-04T12:39:02.433 回答
2

我有一个类似的问题,虽然它有点不同。就我而言,当 NestedScrollView 在 content_main xml(活动的一部分)中时,我在片段中有一个 recycleview。

我用 SwipeRefreshLayout 包裹了片段内的回收视图

这是我的片段的代码:

    <?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
    android:id="@+id/swipe_dummy"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/top_series_recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

剩下要做的就是从代码中禁用 SwipeRefreshLayout

mSwipeLayout.isEnabled = false

如果您不这样做,当您向下滑动时,它将显示无限刷新图标。我想分享这个解决方案,以防有人需要这个功能或者也有这个问题

在你用 SwipeRefreshLayout 包裹 recycleview 之后,你会看到 recycleview 的 addOnScrollListener 会像往常一样被调用

于 2019-04-11T20:55:12.157 回答
0
nestedScrollView.setOnScrollChangeListener { v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->

        val view = nestedScrollView.getChildAt(nestedScrollView.childCount - 1)
        Timber.d("Count==============${nestedScrollView.childCount}")

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

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


    }
于 2021-05-12T07:32:50.840 回答