首页 文章

RecyclerView:Animate项目调整大小

提问于
浏览
19

我有 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

    你应该只使用 notifyItemChanged(getPosition(), new Object()) .

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

  • 11

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

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

    The demo project can be found here .

相关问题