嵌套RecyclerView新增条目后滚动卡顿掉帧问题求助
嵌套RecyclerView滚动卡顿解决方案
- 给内层RecyclerView开启固定大小配置
若内层RecyclerView的高度为固定值/匹配父布局高度,添加代码recyclerView.setHasFixedSize(true),避免新增条目时系统反复测量整个RecyclerView尺寸,减少不必要的布局计算开销。 - 禁用内层RecyclerView的嵌套滚动特性
添加代码recyclerView.setNestedScrollingEnabled(false),关闭嵌套滚动后,滚动事件仅由当前操作的RecyclerView处理,避免父子RecyclerView反复传递消费滚动事件产生的额外性能消耗。 - 配置全局复用缓存池
在外层RecyclerView的Adapter中初始化共享的RecycledViewPool实例,所有内层RecyclerView绑定同一个缓存池,实现多个内层列表的ViewHolder共享复用,大幅减少新增条目时的ViewHolder创建开销,示例代码:// 父Adapter内初始化全局缓存池 private val sharedPool = RecyclerView.RecycledViewPool() // 绑定内层RecyclerView时设置共享池 innerRecyclerView.apply { setRecycledViewPool(sharedPool) // 其他基础配置 } - 优化内层列表的数据刷新逻辑
新增条目时禁止调用notifyDataSetChanged()做全量刷新,使用DiffUtil计算新旧数据差异实现局部增量刷新,仅更新发生变化的条目,减少视图重绘次数。 - 开启预取配置优化滚动体验
给内层列表的LayoutManager设置预取数量,数值可设置为单屏展示的内层条目数+2,示例代码:val layoutManager = LinearLayoutManager(context) layoutManager.initialPrefetchItemCount = 6 // 可根据实际单屏展示数量调整 innerRecyclerView.layoutManager = layoutManager - 优化内层Item绑定逻辑
不要在onBindViewHolder中执行耗时计算、频繁触发视图刷新的操作,图片加载使用固定尺寸缓存策略,避免bind过程中触发View反复测量。
内容的提问来源于stack exchange,提问作者Duseop
相关产品推荐
相关产品推荐

