将==
改成>=
,条件是放宽了,但多次调用的问题更加严重了。在正常滑动过程中,这个方案无法做到精准匹配预加载阈值,即无法实现只回调一次onPreload()
,因为onScroll()
是像素粒度的回调,而预加载要做的表项粒度的检测。
这个方案还有一个缺点:和LayoutManager
类型耦合。代码中使用了if (layoutManager is LinearLayoutManager)
这样的判断,如果要适配StaggeredGridLayoutManager
则必须新增else
分支,如果又多了一个自定义LayoutManager
呢?
类型无关预加载
判断是否预加载的关键是获取表项索引,刚才通过layoutManager.findLastVisibleItemPosition()
获取,其实饶了一大圈。
列表在被显示之前必然经历了onBindViewHolder(holder: ViewHolder, position: Int)
,该方法中就能轻松的获取表项索引,可以把刚才的判断逻辑移到RecyclerView.Adapter
中:
class PreloadAdapter: RecyclerView.Adapter() {
// 预加载回调
var onPreload: (() -> Unit)? = null
// 预加载偏移量
var preloadItemCount = 0
// 列表滚动状态
priv