第一个想到的方案是监听列表滚动状态,当列表快滚动到底部时执行预加载,RecyclerView.OnScrollListener提供了两个回调:
public class RecyclerView {
public abstract static class OnScrollListener {
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState){}
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){}
}
}
在onScrolled()可以拿到LayoutManager,它提供了很多和表项位置有关的方法:
// 为 RecyclerView 新增扩展方法,用于监听预加载事件
fun RecyclerView.addOnPreloadListener(preloadCount: Int, onPreload: () -> Unit) {
// 监听 RecyclerView 滚动状态
addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
// 获取 LayoutManger
val layoutManager = recyclerView.layoutManager
// 如果 LayoutManager 是 Linear