使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作

Posted

技术标签:

【中文标题】使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作【英文标题】:Rotation animation not working properly after using submitList from ListAdapter 【发布时间】:2021-10-12 23:12:49 【问题描述】:

在我的项目中,我有一个可扩展的回收站视图。几乎一切正常。

当我展开视图时,我有一个 V 形,我想为折叠动画执行 180º 旋转,反之亦然。

我正在使用此函数对其中一种状态进行 view.animate().rotation(180f) 的轮换,而对于另一种状态,我将 0 传递给 rotation 函数。

图标第一次动画一起旋转。我现在的问题是,我第二次调用submitList(List<UIModel>) 它本身并没有执行动画,而是图标闪烁到 180º 状态。

一个重要的注意事项是我正在使用 MVI,并且我向ViewHolder 添加了一个点击侦听器,这只是Fragment 的回调,它将将此信息传递给ViewModelViewModel 将更新其状态以使该列表项处于展开状态,然后提交该列表。

如果我在点击侦听器中直接调用上述函数,而不调用submitList() 函数,则旋转动画效果很好。

总而言之,这是流程(第 8 步第一次不适用,它与动画一起正常工作):

    用户点击 chevron; 回调被调用; 片段通知视图模型; 查看模型更新状态; 片段被通知有变化; fragment 提交列表调用 (submitList()); onBindViewHolder被调用,我根据UIModel isExpanded变量进行旋转动画。 应用了旋转,但没有任何动画,只是在两个位置之间轻弹

【问题讨论】:

【参考方案1】:

两个猜测

    旋转值是DiffUtil.Callback 的一部分吗? (表示项目更改的值或其他内容)。

    您是否尝试过为了 androidview.animate().rotation(180f) 替换为更愚蠢的东西,例如:

view.post( ... )

这将在 next 渲染帧内执行您的动画;我怀疑动画被埋在那里并显示了最终状态(物体已经旋转)。

【讨论】:

1.是的,我的意思是,它是 DiffUtil 引用的模型的一部分; 2. 还没有,马上试试,会更新评论 按照您的建议使用view.post( ... ) 运气不佳 我也有类似的感觉,动画被埋没了,因为如果我只是执行动画而不再次调用submitList(),动画效果很好。 这可能是因为您使用的视图动画并没有真正修改视图,而只是修改了视图的绘制位置。我可能会尝试通过value animator 或object animator 使用属性动画。查看Property Animation 文档以获取更多信息,也许这对您来说效果更好。 是的,Android Animation 多年来一直在经历“变化”,所以您并不孤单。如果 RotateAnimation 有效(使用填充标志),那么您就可以开始了。除非您有问题,否则无需为其他事情烦恼。 如果它没有损坏,请不要修复它 :) 但是,我建议你看看 Animator,因为它们相对易于使用且非常方便(尤其是 ObjectAnimator,你可以在可以将rotation 作为值传递,因为它会在内部调用setRotation(...))。但如果它有效,请享受:)

以上是关于使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 ListAdapter 中的 submitList 后,旋转动画无法正常工作

如何将自定义 ListAdapter 设置为 appwidget 中的列表视图?

DiffUtil 重绘 ListAdapter Kotlin 中的所有项目

从android eclipse中的片段刷新或更新listadapter

根据可用的水平空间有条件地在 ListAdapter 中显示项目

RecyclerView | 在 RecyclerView 中使用 ListAdapter