添加/删除RecyclerView条目时禁止自动调整滚动位置的问题咨询
父RecyclerView插入底部条目禁止自动滚动解决方案
这个问题的核心原因是RecyclerView的默认行为:当在列表最后一个可见位置下方插入新条目时,为了让用户感知到新内容的插入,会自动触发小幅滚动偏移,加上DiffUtil异步更新后触发的布局重算,进一步放大了该偏移。以下是可直接落地的解决方案:
- 方案1:提交列表后恢复原有滚动位置
在调用DiffUtil的submitList方法时,利用其提交完成回调,恢复更新前的滚动位置,完全保留原有动画效果:
// 记录更新前的滚动位置和偏移量 val layoutManager = recyclerview1.layoutManager as LinearLayoutManager val firstVisiblePos = layoutManager.findFirstCompletelyVisibleItemPosition() val offset = if (firstVisiblePos >= 0) { layoutManager.findViewByPosition(firstVisiblePos)?.top ?: 0 } else 0 // 提交新列表 adapter.submitList(newList) { // 列表更新完成后恢复滚动位置 layoutManager.scrollToPositionWithOffset(firstVisiblePos, offset) }
- 方案2:禁用预测性条目动画从根源关闭自动滚动
重写LayoutManager的supportsPredictiveItemAnimations方法,关闭条目变更时的预测滚动行为,不会影响正常触摸滚动和业务逻辑:
recyclerview1.layoutManager = object : LinearLayoutManager(context) { override fun supportsPredictiveItemAnimations(): Boolean { return false } }
- 方案3:关闭子RecyclerView的嵌套滚动避免冲突
如果子RecyclerView不需要独立滚动,可关闭其嵌套滚动能力,减少父子控件滚动事件冲突导致的布局抖动:
recyclerview2.isNestedScrollingEnabled = false
注意:以上所有方案均不会干扰原有DiffUtil更新逻辑,也不会影响添加商品到购物车的业务流程,仅修改RecyclerView滚动相关的默认行为。
内容的提问来源于stack exchange,提问作者Mohammed Rampurawala
相关产品推荐
相关产品推荐

