Android recycleView ViewHolder 局部更新 頁(yè)面閃爍問(wèn)題

RecycleView 在調(diào)用Adapter.notifyDataSetChanged()的時(shí)候往往整個(gè)屏幕會(huì)閃爍,特別是有Picasso這種異步加載圖片框架的時(shí)候特別明顯。這里有幾種方法可以解決,個(gè)人比較推薦第三種方式:通過(guò)更改ViewHolder 來(lái)更新,雖然感覺(jué)上會(huì)麻煩些,但是體驗(yàn)效果特別特別好!

1.只更新1個(gè)item:

Adapter有許多更新方式 除了notifyDataSetChange還有很多,有時(shí)間大家可以看看,我們這里直接調(diào)用

Adapter.notifyItemChanged(int Position),

這種方式可以只刷新你要更新的數(shù)據(jù),其他的數(shù)據(jù)是不會(huì)更新的,其他的也就不閃了。

2.取消動(dòng)畫

上述第一個(gè)方法有個(gè)弊端,就是你要更新的那個(gè)item會(huì)有刷新閃爍,其實(shí)我也看了一些人的資料,然后去項(xiàng)目里面看源碼,RecycleView用的動(dòng)畫實(shí)體類是DefaultItemAnimator 這個(gè)類繼承的父類是SimpleItemAnimator,然后這個(gè)類的父類是在RecycleView里面的抽象類ItemAnimator,其中定義如下:

       private long mAddDuration = 120;
        private long mRemoveDuration = 120;
        private long mMoveDuration = 250;
        private long mChangeDuration = 250;

看到了吧,動(dòng)畫也是要有執(zhí)行時(shí)間的,總結(jié)來(lái)說(shuō)就是更改recycleView的動(dòng)畫,減少動(dòng)畫時(shí)間可以減少item的閃爍。
設(shè)置動(dòng)畫大致方法:

  recyclerView.getItemAnimator().setChangeDuration(0);  //設(shè)置更新動(dòng)畫duration為0,其他的你也可以設(shè)置。
  ((DefaultItemAnimator)mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false);//取消動(dòng)畫

或者你愿意的話自定義一個(gè)動(dòng)畫類,這個(gè)類必須繼承自SimpleAnimator,換個(gè)說(shuō)法就是,改一下DefalutAnimator 中的動(dòng)畫效果
因?yàn)镽ecycleView 的動(dòng)畫實(shí)體類就是它。不講太細(xì),我們的目標(biāo)是頁(yè)面不閃爍。

3.通過(guò)更改ViewHolder 來(lái)更新

我覺(jué)得更新數(shù)據(jù)是最輕松的,通過(guò)下面那個(gè)方法獲取ViewHolder,有了viewHolder,有了數(shù)據(jù)你啥不能更新的, 想更新什么就更新什么,而且可以避免因?yàn)橹匦翺nBinderView 導(dǎo)致的資源浪費(fèi)。使用這個(gè)的時(shí)候同時(shí)要記得更新adapter 中的數(shù)據(jù)集,避免數(shù)據(jù)不一致。

(myAdapter.CustomViewHolder) mRecyclerView.findViewHolderForAdapterPosition(i);//獲取ViewHolder

這好歸好,但是這里往往有些問(wèn)題,一般adapter 里面的ViewHolder 很少拿到 adapter 外部去,都是在Adapter里面更新,這樣ViewHolder 的內(nèi)容可以隨便變化,只要數(shù)據(jù)是對(duì)的就好了,但是拿到外部去了之后,以后你想改代碼要麻煩死了雖然我是這樣解決的

mAdapter.updateView(holder,n);

但是也是有殘留的,除非你把RecyclerView的實(shí)體也放到adapter 里面去了,就當(dāng)我沒(méi)說(shuō)這話。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,351評(píng)論 25 708
  • 初春時(shí)節(jié),大地慢慢的復(fù)蘇。一絲春風(fēng)吹過(guò),沒(méi)人知道他的家鄉(xiāng)在哪里,也沒(méi)人知道他到底要去哪里。 那是一個(gè)美麗的清晨,這...
    南懨丶閱讀 188評(píng)論 0 0
  • 在夢(mèng)里 你看了我一眼 帶著無(wú)限的眷戀 無(wú)限的感傷 又有著 無(wú)限的渴望 所有的所有的 都在你的眼眸里 我 潸然淚下 ...
    荊芥_f5dd閱讀 168評(píng)論 0 3
  • 今天寶寶說(shuō)要做面包,問(wèn)他怎么做,他說(shuō)放好面粉攪啊攪,然后就發(fā)酵十五分鐘,然后就烘,然后就停了,然后就做好了橡...
    霞光暖陽(yáng)閱讀 207評(píng)論 0 0

友情鏈接更多精彩內(nèi)容