RecyclerView 移除动画bug

Posted

技术标签:

【中文标题】RecyclerView 移除动画bug【英文标题】:RecyclerView remove animation bug 【发布时间】:2016-07-07 03:17:45 【问题描述】:

我已经实现了一个RecyclerView,我可以在其中添加和删除项目。我希望将添加的项目添加到倒数第二个位置,并且每当我添加新项目时,动画运行良好。也就是说,最后一个项目向下移动,为新项目留出空间。

当我删除一个项目时,出现了一个我不知道如何解决的问题。我希望它的行为方式是:

    淡出删除的元素, 向上移动它下面的所有项目。

实际发生的是,首先,最后一个项目消失,然后动画的其余部分发生。当被删除元素下方的项目向上移动时,最后一个项目重新出现为来自墙后。

在我看来,RecyclerView 似乎缩小到“动画后”高度,然后执行动画。

我还没有定义ItemAnimator,所以DefaultItemAnimator 必须是使用的那个。我看过this video,并在LinearLayoutManager 的自定义实现中覆盖了supportsPredictiveItemAnimations 方法,但它并没有修复它。

【问题讨论】:

【参考方案1】:

我已经通过 Google 问题跟踪器here 报告了该问题

希望我们能尽快修复!正如您所说,当您的 recyclerview 包装其内容以计算其高度时,它似乎与 recyclerview 的度量更新和动画之间可能存在的竞争条件非常相关。

This article 也非常详细地解释了问题。

【讨论】:

问题已于 2017 年 5 月 25 日以“无法修复(预期行为)”结束。错误仍然存​​在 :( 链接的文章很有帮助,基本上不要在RecylerView上使用wrap_content,androidX中仍然存在错误【参考方案2】:

可能有点晚了,但我可以通过将 RecyclerView 项目动画器设置为 null 来解决这个问题,然后在我的适配器的 setList(list) 函数中调度一个转换:

Transition transition = new AutoTransition();
transition.setDuration(200); // Or any duration you want
TransitionManager.beginDelayedTransition(mRootViewGroup, transition);

其中 mRootViewGroup 是包含 RecyclerView 的视图组。

这个问题也可以通过将你的 layout_height(或宽度,取决于滚动方向)设置为 wrap_content 以外的其他值来解决,但是如果像我一样,你需要将你的 recyclerview 高度设置为 wrap_content,这可能是你的解决方案.

不确定它是否也能解决您的问题,但我想我不妨分享一下对我有用的方法。

【讨论】:

以上是关于RecyclerView 移除动画bug的主要内容,如果未能解决你的问题,请参考以下文章

Android番外篇 RecyclerView 移除飞行效果动画

RecyclerView的ItemAnimator

RecyclerView 上的项目删除没有动画

Android L 中的 RecyclerView ItemAnimator 故障

RecyclerView添加分割线

移除 RecyclerView 滚动效果