super.onScrolled(recyclerView, dx, dy)
// 获取 LayoutManger
val layoutManager = recyclerView.layoutManager
// 如果 LayoutManager 是 LinearLayoutManager
if (layoutManager is LinearLayoutManager) {
/
/ 如果列表正在往上滚动,并且表项最后可见表项索引值 等于 预加载阈值
if (dy > 0 && layoutManager.findLastVisibleItemPosition() == layoutManager.itemCount - 1 - preloadCount) {
onPreload()
}
}
}
})
}
当列表滚动时,实时检测列表中最后一个可见表项索引 和 预加载阈值 是否相等,若相等则表示列表快滚动到底部了,则触发预加载回调。
然后就可以像这样实现预加载:
recyclerView.addOnPreloadListener(3) {// 当距离列表底部还有 3 个表项时执行预加载
// 预加载业务逻辑
}
一运行 Demo 就测出 bug:当快速滚动列表时onPreload()没有执行,当慢慢滚动列表时onPrelaod()会执行多次。
原因是RecyclerView并不保证每个表项出现时onScrolled()都会被调用,若滚动非常快,某个表项错过该回调