NestedScrollView中的RecyclerView Scroll Listener

问题描述 投票:19回答:2

我在EndlessRecyclerView结束时有一个NestedScrollViewEndlessRecyclerView表示:当用户滚动到recyclerView的底部时,它会加载更多数据。这已经实现并在其他地方工作但是当我把recyclerView放在NestedScrollView中时,OnScrollListener事件不会触发。

CML设计:

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

如何获得上述案例的滚动事件?

我知道在彼此内部有两个可滚动视图并不好。但是,如果没有两个可滚动的视图,我怎么能有上述情况呢?

我已经按照这个链接但它不起作用:scroll event for recyclerview inside scrollview android

android android-recyclerview infinite-scroll onscrolllistener android-nestedscrollview
2个回答
44
投票

要在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


0
投票

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

我使用SwipeRefreshLayout包装了片段中的recycleview

这是我片段的代码:

    <?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包装recyclerview之后,您将看到recyclelerview的addOnScrollListener将像往常一样被调用

© www.soinside.com 2019 - 2024. All rights reserved.