You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获知RecyclerView将要填充的item数量及绑定完成的回调方式

关于RecyclerView预计算绑定次数与填充完成回调的实现方案

预获知ViewHolder创建/onBind执行次数的方案

调用notifyDataSetChanged()等通知方法前,无法100%精确计算即将创建的ViewHolder数量,不过可以得到近似的onBindViewHolder执行次数:

  • onBindViewHolder的执行次数仅和当前RecyclerView的可见区域(包含LayoutManager默认的上下预加载Item,通常为2~3个)范围相关,全局刷新场景下可见范围内的所有Item都会重新执行绑定,你可以通过如下方式估算:
    1. 调用当前LayoutManager的findFirstVisibleItemPosition()、findLastVisibleItemPosition()拿到当前可见区间
    2. 计算lastVisible - firstVisible + 1 + 预加载数量,即可得到即将执行的onBindViewHolder近似次数
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:24:03