ViewPager2第二页内嵌RecyclerView无限滚动不触发问题如何解决
问题原因
- RecyclerView高度配置错误
如果布局中RecyclerView的高度设置为wrap_content,它会一次性渲染所有已加载的item,自身不会产生滚动行为,滚动监听自然不会触发加载更多逻辑。 - 嵌套滚动事件冲突
ViewPager2本身基于RecyclerView实现,默认会优先处理滚动事件,会拦截子RecyclerView的部分滚动回调,导致EndlessRecyclerViewScrollListener的onLoadMore无法被触发。 - 数据加载后未正确更新状态
请求到分页数据后,没有调用适配器的更新方法通知列表刷新,EndlessRecyclerViewScrollListener读取的总item数不会变化,会判定没有更多数据需要加载。 - 滚动监听初始化时机错误
你给ViewPager2设置了setOffscreenPageLimit(5),第二页Fragment会提前初始化,此时RecyclerView还未完成布局测量,滚动监听的初始状态计算错误,后续无法正常触发加载逻辑。
修复方案
- 修正RecyclerView高度配置
将布局文件中RecyclerView的高度改为match_parent,同时保证它的所有父布局的高度配置不会压缩RecyclerView的显示区域,让RecyclerView只渲染可见范围内的item,产生正常的滚动行为。 - 解决嵌套滚动冲突
给RecyclerView禁用嵌套滚动特性,代码如下:
也可以在布局文件中添加属性:recyclerView.setNestedScrollingEnabled(false);android:nestedScrollingEnabled="false" - 正确更新列表状态
在getData方法的接口请求成功回调中,添加数据后调用适配器的范围更新方法:private void getData(final int page) { // 调用接口请求数据 api.requestPageData(page, new Callback() { @Override public void onSuccess(List<Object> newData) { int oldSize = objects.size(); objects.addAll(newData); // 通知适配器插入了新数据 myAdapter.notifyItemRangeInserted(oldSize, newData.size()); } }); } - 延迟注册滚动监听
把滚动监听的注册逻辑延迟到RecyclerView完成布局后执行:@Override public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); recyclerView = view.findViewById(R.id.recycler_view); layoutManager = new LinearLayoutManager(getContext()); recyclerView.setLayoutManager(layoutManager); myAdapter = new MyAdapter(getContext(), layoutManager, objects); recyclerView.setAdapter(myAdapter); // 延迟到布局完成后注册监听 recyclerView.post(() -> { scrollListener = new EndlessRecyclerViewScrollListener(layoutManager) { @Override public void onLoadMore(int page, int totalItemsCount, RecyclerView view) { getData(page); } }; recyclerView.addOnScrollListener(scrollListener); }); }
内容的提问来源于stack exchange,提问作者user1695123
相关产品推荐
相关产品推荐

