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

关闭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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:29:56