RecyclerView:Animate项目调整大小

时间:2014-12-12 14:44:32

标签: android android-recyclerview layouttransition

我有RecyclerView。回收者视图的每个项目都可以扩展或不扩展。只能同时扩展一个项目。

本质上,我试图在lolipop dialier中重新创建历史列表。

我发现using a LayoutTransition on RecyclerView makes it crash

但我无法正确设置两种状态之间项目视图更改的动画。

我与getItemAnimator().setSupportsChangeAnimations(true)一起尝试notifyItemChanged(getPosition()),但有两个问题:

  • 视图被重新创建,使得过渡非常奇怪,因为它在项目移动的同时在下一个项目上方淡入。出现的新视图不是调整大小,它已经是完整大小。
  • 当视图重新创建时,旧视图会在淡入淡出时淡出,这会使视图背景颜色闪烁。

我还尝试在动画的持续时间内在项目视图上设置LayoutTransition,但这种方法的问题是RecycleView的布局会立即更新而不会跟随动画。

我为这两个尝试创建了一个针对此问题的小型演示项目。 The projects sources are here

如何在项目布局更改中创建平滑过渡?

2 个答案:

答案 0 :(得分:11)

好的,所以我找到了一个不涉及调用notifyItemChanged的解决方案,因此视图不会被替换。 con是你必须手动检查视图的一致性。为此,我创建了一个小型库,可以在ViewHolder中为5个loc提供我正在寻找的内容。

诀窍是手动设置高度变化,而不是使用LayoutTransition。

The demo project can be found here

答案 1 :(得分:0)

您应该使用notifyItemChanged(getPosition(), new Object())代替。

在您的适配器中,覆盖onBindViewHolder(GigExtraViewHolder holder, int position, List<Object> payloads),如果有效负载为null或为空,则执行原始绑定逻辑,否则,只需执行自己的展开/折叠动画。