如何实现RecyclerView的ItemAnimator来禁用notifyItemChanged的animation

在我的项目中,我需要禁用RecyclerView的“更改”animation,而notifyItemChanged

我调查了RecyclerView的源代码,并重写了android.support.v7.widget.DefaultItemAnimator ,如下所示:

 private static class ItemAnimator extends DefaultItemAnimator { @Override public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromX, int fromY, int toX, int toY) { if(oldHolder != null) { oldHolder.itemView.setVisibility(View.INVISIBLE); dispatchChangeFinished(oldHolder, true); } if(newHolder != null) { dispatchChangeFinished(newHolder, false); } return false; } } 

但我不确定是否符合Google文档的规格: RecyclerView.ItemAnimator.animateChange

根据我对源代码的理解,如果我没有正确地覆盖这个方法,oldHolder 将不会被回收。

请帮我弄清楚如何以正确的方式覆盖animateChange

我find了正确的解决scheme,只是删除animateChange。

这很简单。 Google已经实现了这个function。

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

文档: setSupportsChangeAnimations

我有同样的问题。 当调用notifyItemChanged时,有一个红色的覆盖层闪烁。 在对代码进行实验之后,我最终通过简单地调用来移除默认的Animator

 recyclerView.setItemAnimator(null); 

在RecyclerView上。

@Kenny的答案不工作了,因为谷歌删除方法setSupportsChangeAnimations() (但为什么?)在支持库23.1.0。

在某些情况下, setChangeDuration(0)可以用作解决方法。

@edit我build议使用类似的东西:

  RecyclerView.ItemAnimator animator = recyclerView.getItemAnimator(); if (animator instanceof SimpleItemAnimator) { ((SimpleItemAnimator) animator).setSupportsChangeAnimations(false); } 

如果find了一个解决scheme,对每个想要保留DefaultItemAnimator给出的所有animation的人,但是摆脱每次更新视图时出现的“闪烁”animation。

首先,获取DefaultItemAnimator的源代码。 在你的项目中创build一个同名的类。

其次,将ItemAnimator设置为修改后的DefaultItemAnimator的新实例,如下所示:

 recyclerView.setItemAnimator(new MyItemAnimator()); 

然后,进入新的类源代码并find方法

 animateChangeImpl(final ChangeInfo changeInfo) { ... } 

现在,我们只需find更改alpha值的方法调用。 find以下两行并删除.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() { ... } 

就像有人像我一样绊倒
不知怎的, setSupportsChangeAnimations(false)不适合我,但recyclerView.getItemAnimator().setChangeDuration(0)刚好删除了animation。

最简单的解决scheme是在构造函数中扩展DefaultItemAnimator并将setSupportsChangeAnimations设置为false

 public class DefaultItemAnimatorNoChange extends DefaultItemAnimator { public DefaultItemAnimatorNoChange() { setSupportsChangeAnimations(false); } }