繁体   English   中英

在 RecyclerView.Adapter 中覆盖 notifyItemChanged 的​​动画

[英]Override animation for notifyItemChanged in RecyclerView.Adapter

好吧,我有一个带适配器的 RecyclerView,一切都很好。 ArrayList 数据集中的项目会定期更新。 因此,项目及其元素以及它们在列表中的位置都会发生变化。 这是通过简单的排序和手动调用这些方法来实现的,无论何时发生:

// swapping two items
Collections.swap(items, i, j);
itemsAdapter.notifyItemMoved(i, j);

// adding a new one
itemAdapter.notifyItemInserted(items.size());

// when updating valus
itemAdapter.notifyItemChanged(i);

后者,是我痛苦的原因。 每次更新项目时,都会触发一点“闪烁”动画。

我为此找到了几个解决方案:

// disabling all animations
recyclerView.getItemAnimator().setSupportsChangeAnimations(false);

// or

// setting the animation duration to zero,
recyclerView.getItemAnimator().setChangeDuration(0);

但是当项目移动(被交换)时,这两个都会杀死动画。 我只想覆盖一个动画并保留所有这些魔法。 有没有办法做到这一点? 如果它覆盖了 ItemAnimator,有没有人有一个简单的例子?

提前致谢!

有一种专门的方法可以禁用仅更改项目的动画:

((SimpleItemAnimator) myRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

官方文档

是的,我做到了。

首先,获取 DefaultItemAnimator 的源代码。 获取代码并在您的项目中创建一个名为 MyItemAnimator 的类。 然后,将 ItemAnimator 设置为修改后的 MyItemAnimator 的新实例,如下所示:

recyclerView.setItemAnimator(new MyItemAnimator());

现在,进入新类源代码并找到该方法

animateChangeImpl(final ChangeInfo changeInfo) { ... }

我们只需要定位改变 alpha 值的方法调用。 找到以下两行并删除 .alpha(0) 和 .alpha(1)

oldViewAnim.alpha(0).setListener(new VpaListenerAdapter() { ... }
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).alpha(1).setListener(new VpaListenerAdapter() { ... }

像这样

oldViewAnim.setListener(new VpaListenerAdapter() { ... }
newViewAnimation.translationX(0).translationY(0).setDuration(getChangeDuration()).setListener(new VpaListenerAdapter() { ... }

尝试设置:

mRecyclerview.setItemAnimator(null);

@Pablo A. Martínez 的Kotlin版本回答:

(recyclerView.itemAnimator as SimpleItemAnimator).supportsChangeAnimations = false

如果你只是修改 Recyclerview 的数据意味着没有添加或删除项目,那么你应该添加这一行。

mRecyclerview.setHasFixedSize(true); 

这样recyclerview就会知道在您可以申请之后尺寸没有变化

((SimpleItemAnimator) mRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);

这样动画就会消失,代码就会像魅力一样工作:)

亚历克斯的回答略有不同。

我没有完全删除 alpha 更改,而是减少了它。 唯一需要改变的是:

        //changed alpha from 0
        ViewCompat.setAlpha(newHolder.itemView, 0.5f);

        //changed alpha from 0
        oldViewAnim.alpha(0.5f).setListener(new VpaListenerAdapter() {

在这两种情况下,将 0 更改为 0.5 这具有消除与 alpha 相关的闪烁完全为 0 的效果,但保持项目更改动画的变形质量。

在我的例子中,recyclerview 占据了工具栏下方的所有空间。 我所做的只是将 recyclerview 的 layout_height 从 wrap_content 更改为 match_parent 并且闪烁消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM