请支持原作者:
奋斗小疯峰
虽说RecyclerView的默认item动画很炫酷,但是在开发中,客户的需求可能并不需要使用item动画,不仅觉得没用,反而觉得这些item动画是程序的bug。
本人在做开发仿微信项目时就遇到这类问题,动态增加、删除条目时就有一个切换的动画,这明显不是我想要的,于是百度,百度到一篇有点用的文章(RecyclerView局部刷新动画屏蔽),文章说到的只是针对RecyclerView的notifyItemChanged,notifyItemAdd,notifyItemRemoved方法的默认动画进行屏蔽,设置之后并不能解决我的问题,没有效果。
于是,继续研究,最后,得到一个结论:为了解决上述问题,有两种做法,一种是重写ItemAnimator并对RecyclerView进行设置(网友说的,但没有给出代码…),另一种是设置ItemAnimator的动画时间(自己无意间想到的,why? I don’t know),权衡自己的目前实力和项目时间,我决定使用第二种方式,在RecyclerView的源码中可以看到各种动画的执行时长如下:
private long mAddDuration = 120;private long mRemoveDuration = 120;private long mMoveDuration = 250;private long mChangeDuration = 250;
1
2
3
4
而RecyclerView自带getItemAnimator().setXXDuration();方法。所以,接下来直接上代码(该代码中的this指的就是RecyclerView,是本人一个开源项目LQRRecyclerViewLibrary中的部分代码片段):
/** * 打开默认局部刷新动画 / public void openDefaultAnimator() { this.getItemAnimator().setAddDuration(120); this.getItemAnimator().setChangeDuration(250); this.getItemAnimator().setMoveDuration(250); this.getItemAnimator().setRemoveDuration(120); ((SimpleItemAnimator) this.getItemAnimator()).setSupportsChangeAnimations(true); } /* * 关闭默认局部刷新动画 */ public void closeDefaultAnimator() { this.getItemAnimator().setAddDuration(0); this.getItemAnimator().setChangeDuration(0); this.getItemAnimator().setMoveDuration(0); this.getItemAnimator().setRemoveDuration(0); ((SimpleItemAnimator) this.getItemAnimator()).setSupportsChangeAnimations(false); }