我正在使用一个 RecyclerView
,它使用 SortedListAdapterCallback
从 SortedList
中获取数据。我想为 onChange
事件禁用动画,但为 onInserted
/onRemoved
/onMoved
保留它们。我尝试在 RecyclerView
使用的 DefaultItemAnimator
上调用 setSupportsChangeAnimations(false)
,但动画仍然出现。如果我调用 setItemAnimator(null)
所有 动画都会按预期成功删除。
我试着查看实现,似乎如果 supportsChangeAnimations
是 true
,RecyclerView
将通过保留旧的 viewHolder 来动画更改事件并将其交叉淡化到新的 viewHolder。我不想要那个。如果 supportsChangeAnimations
为 false
,则新旧 viewHolder 将是同一个对象,并且将有一个从 x 到 x 的 onMoved
动画(即没有实际移动)。然而,这意味着该项目将获得恼人的弹跳效果。我也不想要那个,我根本不想要动画。 :(
来自 DefaultItemAnimator.java:
@Override
public boolean animateChange(ViewHolder oldHolder, ViewHolder newHolder,
int fromX, int fromY, int toX, int toY) {
if (oldHolder == newHolder) {
// Don't know how to run change animations when the same view holder is re-used.
// run a move animation to handle position changes.
return animateMove(oldHolder, fromX, fromY, toX, toY);
}
...
有时,当我加载我的列表时,我会异步获取一些数据并更新项目 1-3 次,每次它跳动和闪烁时看起来真的很糟糕。
如何在不编写完全自定义的 ItemAnimator 的情况下有效地完全禁用 onChange
动画?
最佳答案
我参加这个聚会有点晚了,但是使用 androidx.recyclerview:recyclerview:1.1.0
我可以设置更改默认动画师的 changeDuration
到 0 这会有效地禁用动画,同时允许添加/移动/删除动画继续正常运行。无需自定义覆盖 DefaultItemAnimator
。
示例(在 Kotlin 中):
view.my_recycler_view.itemAnimator?.changeDuration = 0
关于android - 在 RecyclerView 的 ItemAnimator 上禁用 onChange 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35766497/