}
}
}
})
}
当列表滚动时,实时检测列表中最后一个可见表项索引 和 预加载阈值 是否相等,若相等则表示列表快滚动到底部了,则触发预加载回调。 然后就可以像这样实现预加载:
recyclerView.addOnPreloadListener(3) {// 当距离列表底部还有 3 个表项时执行预加载
// 预加载业务逻辑
}
一运行 Demo 就测出 bug:当快速滚动列表时onPreload()
没有执行,当慢慢滚动列表时onPrelaod()
会执行多次。
原因是RecyclerView
并不保证每个表项出现时onScrolled()
都会被调用,若滚动非常快,某个表项错过该回调是有可能发生的。
为了避免错过,只能放宽条件:
if (dy > 0 && layoutManager.findLastVisibleItemPosition() >= layoutManager.itemCount - 1 - preloadCount) {
onPreload()
}
将==
改成>=
,条件是放宽了,但多次调用的问题更加严重了。在正常滑动过程中,这个方案无法做到精准匹配预加载阈值,即无法实现只回调一次onPreload()
,因为onScroll()
是像素粒度的回调,而预加载要做的表项粒度的检测。
这个方案还有一个缺点:和LayoutManager
类型耦合。代码中使用了if (layoutMan