当我滚动 RecyclerView 时,有什么方法可以为它的元素设置动画吗?
我看了一下DefaultItemAnimator
and RecyclerView.ItemAnimator
,但动画似乎只有在数据集发生变化时才会被调用,如果我错了,请纠正我。
我有点困惑RecyclerView.ItemAnimator.animateMove()
它什么时候被调用?我在该类中放置了一些断点,但它们都没有停止我的应用程序。
但是回到我的问题,如何为 RecyclerView 设置动画?我希望某些元素具有另一种不透明度,这取决于一些自定义规则。
我做了一些更深入的研究,似乎动画移动正是我正在寻找的。该方法从dispatchLayout()
. 这是该方法的javadoc:
layoutChildren() 的包装器,用于处理由布局引起的动画更改。动画的工作假设有五种不同的项目在运行:
PERSISTENT:项目在布局之前和之后可见
REMOVED:项目在布局之前可见并且被应用程序删除
ADDED:项目在布局之前不存在并且被添加应用
消失:项目存在于数据集中之前/之后,但在布局过程中从可见变为不可见(它们被移出屏幕作为其他更改的副作用)
出现:项目存在于数据集中之前/之后,但在布局过程中从不可见变为可见(它们在屏幕上移动作为其他更改的副作用)
总体方法确定布局之前/之后存在哪些项目,并为每个项目推断上述五种状态之一。然后相应地设置动画:
PERSISTENT 视图被移动 ({@link ItemAnimator#animateMove(ViewHolder, int, int, int, int)}) REMOVED 视图被移除 ({@link ItemAnimator#animateRemove(ViewHolder)})
ADDED 视图被添加 ({@link ItemAnimator#animateAdd(ViewHolder)})
消失的视图被移出屏幕
出现的视图被移到屏幕上
到目前为止,我正在寻找持久性、消失和出现,但是由于这里的这一行,这些方法从未被调用:
boolean animateChangesSimple = mItemAnimator != null && mItemsAddedOrRemoved
&& !mItemsChanged;
mItemsAddedOrRemoved
永远是假的,所以没有一个回调到达。知道如何正确设置设置标志吗?