請(qǐng)支持原作者:
奮斗小瘋峰
雖說(shuō)RecyclerView的默認(rèn)item動(dòng)畫很炫酷甸箱,但是在開發(fā)中,客戶的需求可能并不需要使用item動(dòng)畫舶斧,不僅覺(jué)得沒(méi)用添忘,反而覺(jué)得這些item動(dòng)畫是程序的bug。
本人在做開發(fā)仿微信項(xiàng)目時(shí)就遇到這類問(wèn)題,動(dòng)態(tài)增加凌净、刪除條目時(shí)就有一個(gè)切換的動(dòng)畫悲龟,這明顯不是我想要的,于是百度冰寻,百度到一篇有點(diǎn)用的文章(RecyclerView局部刷新動(dòng)畫屏蔽)须教,文章說(shuō)到的只是針對(duì)RecyclerView的notifyItemChanged,notifyItemAdd斩芭,notifyItemRemoved方法的默認(rèn)動(dòng)畫進(jìn)行屏蔽轻腺,設(shè)置之后并不能解決我的問(wèn)題,沒(méi)有效果划乖。
于是贬养,繼續(xù)研究,最后琴庵,得到一個(gè)結(jié)論:為了解決上述問(wèn)題误算,有兩種做法,一種是重寫ItemAnimator并對(duì)RecyclerView進(jìn)行設(shè)置(網(wǎng)友說(shuō)的迷殿,但沒(méi)有給出代碼…)儿礼,另一種是設(shè)置ItemAnimator的動(dòng)畫時(shí)間(自己無(wú)意間想到的,why? I don’t know)贪庙,權(quán)衡自己的目前實(shí)力和項(xiàng)目時(shí)間蜘犁,我決定使用第二種方式翰苫,在RecyclerView的源碼中可以看到各種動(dòng)畫的執(zhí)行時(shí)長(zhǎng)如下:
private long mAddDuration = 120;private long mRemoveDuration = 120;private long mMoveDuration = 250;private long mChangeDuration = 250;
1
2
3
4
而RecyclerView自帶getItemAnimator().setXXDuration();方法止邮。所以,接下來(lái)直接上代碼(該代碼中的this指的就是RecyclerView奏窑,是本人一個(gè)開源項(xiàng)目LQRRecyclerViewLibrary中的部分代碼片段):
/** * 打開默認(rèn)局部刷新動(dòng)畫 / public void openDefaultAnimator() { this.getItemAnimator().setAddDuration(120); this.getItemAnimator().setChangeDuration(250); this.getItemAnimator().setMoveDuration(250); this.getItemAnimator().setRemoveDuration(120); ((SimpleItemAnimator) this.getItemAnimator()).setSupportsChangeAnimations(true); } /* * 關(guān)閉默認(rèn)局部刷新動(dòng)畫 */ public void closeDefaultAnimator() { this.getItemAnimator().setAddDuration(0); this.getItemAnimator().setChangeDuration(0); this.getItemAnimator().setMoveDuration(0); this.getItemAnimator().setRemoveDuration(0); ((SimpleItemAnimator) this.getItemAnimator()).setSupportsChangeAnimations(false); }