如何实现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); } }