【问题标题】:RecyclerView remove animation bugRecyclerView 移除动画bug
【发布时间】:2025-12-02 09:45:02
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: android android-recyclerview animator


    【解决方案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,这可能是你的解决方案.

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

    【讨论】: