NestedScrollView 内的 RecyclerView ScrollListener
RecyclerView ScrollListener inside NestedScrollView
我在 NestedScrollView
的末尾有一个 EndlessRecyclerView
。 EndlessRecyclerView
表示:当用户滚动到 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
}
});
如何获取上述情况的滚动事件?
我知道将两个可滚动视图放在彼此内部是不好的。但是,如果没有两个可滚动视图,我怎么会有上述情况呢?
我已经按照这个 link 但是它不起作用:scroll event for recyclerview inside scrollview android
要实现NestedScrollView下的recycler view无限滚动,可以使用"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 在 content_main xml(activity 的一部分)中。
我用 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 的 addOnScrollListener
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
}
}
}
}
});
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()
}
}
我在 NestedScrollView
的末尾有一个 EndlessRecyclerView
。 EndlessRecyclerView
表示:当用户滚动到 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
}
});
如何获取上述情况的滚动事件?
我知道将两个可滚动视图放在彼此内部是不好的。但是,如果没有两个可滚动视图,我怎么会有上述情况呢?
我已经按照这个 link 但是它不起作用:scroll event for recyclerview inside scrollview android
要实现NestedScrollView下的recycler view无限滚动,可以使用"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 在 content_main xml(activity 的一部分)中。
我用 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 的 addOnScrollListener
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
}
}
}
}
});
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()
}
}