我看了一下DefaultItemAnimator和RecyclerView.ItemAnimator,但是这些动画似乎只有在数据集更改时才会被调用,请纠正我如果我错了的话。
我对RecyclerView.ItemAnimator.animateMove()有点困惑,它什么时候被调用?我在那个类中放了一些断点,但是没有一个断点停止我的应用程序。
不过回到我的问题,如何对RecyclerView进行动画处理?我希望一些元素有另一个不透明度,这取决于某些自定义规则。
我做了一些更多的研究,似乎移动动画正是我要寻找的。这些方法从dispatchLayout()中调用。以下是该方法的文档:
到目前为止,我正在寻找PERSISTENT、DISAPPEARING和APPEARING,但是这些方法从未被调用,因为有这样一行:包装layoutChildren(),处理由布局引起的更改的动画。 动画工作的基础是有五种不同类型的项在播放:
PERSISTENT:项目在布局之前和之后都可见
REMOVED:项目在布局之前可见,被应用程序删除
ADDED:项目在布局之前不存在,被应用程序添加
DISAPPEARING:项目存在于数据集中之前/之后,但在布局过程中从 可见到不可见(它们由于其他更改的副作用而移出了 屏幕)
APPEARING:项目存在于数据集中之前/之后,但在布局过程中从 不可见到可见(它们由于其他更改的副作用而移上去 屏幕)
整体方法找出哪些项目在布局之前/之后存在, 为每个项目推断五种状态之一。然后动画 相应地设置:
PERSISTENT视图被移动({@link ItemAnimator#animateMove(ViewHolder, int, int, int, int)}) 移除的视图被删除({@link ItemAnimator#animateRemove(ViewHolder)})
添加的视图已添加({@link ItemAnimator#animateAdd(ViewHolder)})
DISAPPEARING视图被移到屏幕外
APPEARING视图被移入屏幕
boolean animateChangesSimple = mItemAnimator != null && mItemsAddedOrRemoved
&& !mItemsChanged;
mItemsAddedOrRemoved
一直是 false,所以这些回调函数都不会被触发。有什么办法可以正确设置该标志?