20

我有一个RecyclerView. 回收站视图的每个项目都可以展开或不展开。一次只能展开一项。

本质上,我正在尝试在棒棒糖拨号器中重新创建历史列表。

我发现在 RecyclerView 上使用 LayoutTransition 会使其崩溃

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

我已经尝试过getItemAnimator().setSupportsChangeAnimations(true)notifyItemChanged(getPosition())但有两个问题:

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

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

我为这两次尝试都创建了一个关于这个问题的小型演示项目。 项目来源在这里

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

4

2 回答 2

12

好的,所以我找到了一个不涉及调用的解决方案,notifyItemChanged因此不会替换视图。缺点是您必须手动检查视图一致性。为此,我创建了一个小型库,它允许我正在寻找的内容,在 ViewHolder 中有 5 个位置。

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

演示项目可以在这里找到

于 2014-12-15T15:36:05.317 回答
0

你应该notifyItemChanged(getPosition(), new Object())改用。

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

于 2016-09-27T08:13:12.183 回答