如何获知RecyclerView将要填充的item数量及绑定完成的回调方式
关于RecyclerView预计算绑定次数与填充完成回调的实现方案
预获知ViewHolder创建/onBind执行次数的方案
调用notifyDataSetChanged()等通知方法前,无法100%精确计算即将创建的ViewHolder数量,不过可以得到近似的onBindViewHolder执行次数:
onBindViewHolder的执行次数仅和当前RecyclerView的可见区域(包含LayoutManager默认的上下预加载Item,通常为2~3个)范围相关,全局刷新场景下可见范围内的所有Item都会重新执行绑定,你可以通过如下方式估算:- 调用当前LayoutManager的
findFirstVisibleItemPosition()、findLastVisibleItemPosition()拿到当前可见区间 - 计算
lastVisible - firstVisible + 1 + 预加载数量,即可得到即将执行的onBindViewHolder近似次数
- 调用当前LayoutManager的
- ViewHolder的创建数量不固定,取决于RecyclerView复用池内是否有匹配viewType的缓存ViewHolder,只有缓存不足时才会创建新的ViewHolder,该数值无法提前预估。
填充绑定完成回调的实现
你当前重写LayoutManageronLayoutCompleted的方案是官方原生支持的可靠实现,该方法会在所有可见Item完成布局、绑定操作后触发,你可以在回调内直接拿到实际完成绑定的Item数量,优化后的示例代码如下:
RecyclerView(context).apply { layoutManager = object: LinearLayoutManager(context, VERTICAL, false) { override fun onLayoutCompleted(state: RecyclerView.State?) { super.onLayoutCompleted(state) val firstVisibleItemPosition = findFirstVisibleItemPosition() val lastVisibleItemPosition = findLastVisibleItemPosition() if(firstVisibleItemPosition == -1 || lastVisibleItemPosition == -1) return // 实际完成绑定的可见Item总数 val completedBindCount = lastVisibleItemPosition - firstVisibleItemPosition + 1 Log.d("RECYCLER", "所有同步填充完成,完成绑定的Item数:$completedBindCount") } } }
该方案同样适配GridLayoutManager、StaggeredGridLayoutManager等其他LayoutManager子类,只需修改继承的父类即可。
内容的提问来源于stack exchange,提问作者daniyelp
相关产品推荐
相关产品推荐

