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 移除飞行效果动画