关闭RecyclerView子项尺寸变化动画,解决点击尺寸变更卡顿问题
解决RecyclerView中自定义View尺寸变化卡顿的问题
这个卡顿的核心原因是RecyclerView默认的ItemAnimator会对Item的尺寸变更执行过渡动画,这类动画在频繁触发时容易导致卡顿。下面给你几个可行的解决方案:
方法一:直接关闭RecyclerView的Item动画
最简单的方式就是禁用RecyclerView的所有Item动画,在初始化RecyclerView的地方添加:
recyclerView.itemAnimator = null
如果你只想禁用尺寸变化的动画,保留增删Item等其他动画,可以用DefaultItemAnimator单独关闭变更动画:
val animator = DefaultItemAnimator() animator.supportsChangeAnimations = false recyclerView.itemAnimator = animator
这个方法最快见效,适合不需要Item变更动画的场景。
方法二:优化自定义View的尺寸变更逻辑
你的setColorSelected方法已经做了状态判断,可以再优化setCurrentSize的实现,减少不必要的布局重排开销:
private fun setCurrentSize(size: Int) { val params = layoutParams if (params.height != size || params.width != size) { params.width = size params.height = size // 用layout()替代requestLayout(),直接更新View位置尺寸,减少全局布局请求 layout(left, top, left + size, top + size) } }
另外,在ColorView的构造方法里关闭自身的布局动画,避免View内部触发额外动画:
init { animateLayoutChanges = false }
方法三:确保RecyclerView Item尺寸固定
你的view_item_color.xml里已经用FrameLayout占满了最大选中尺寸,ColorView只是在内部缩放,理论上Item本身的尺寸不会变化。可以再给RecyclerView设置固定尺寸标记,让它避免重复计算布局:
recyclerView.setHasFixedSize(true)
这个属性会告诉RecyclerView:所有Item的尺寸都是固定的,不需要每次数据变化时重新计算布局大小,能有效减少性能消耗。
额外优化建议
- 确保
ColorsAdapter的onBindViewHolder里没有耗时操作,所有颜色解析工作都放在初始化阶段完成(你已经做到了,这点很好) - 如果用的是GridLayoutManager,固定spanSize参数,避免布局频繁调整
内容的提问来源于stack exchange,提问作者artem
相关产品推荐
相关产品推荐

