RecyclerView:使用DiffUtil刷新錯(cuò)位

由于項(xiàng)目的需求和DiffUtil的性能星压,所以在新項(xiàng)目中選用了DiffUtil進(jìn)行刷新操作。但是在使用過程中遇到了不少的坑逮光,其中比較嚴(yán)重的就是刷新錯(cuò)位卒落,在這里簡(jiǎn)單記錄下

DiffUtil的基本使用:http://www.reibang.com/p/b50fb4d153bd

RecyclerView的多樣化定制讓大家愛不釋手,也是大家選擇RecyclerView的一個(gè)重要原因嫩与,但是如今這個(gè)有點(diǎn)在使用DiffUtil的時(shí)候造成了一定程度上的困擾:DiffUtil刷新時(shí)候的position是數(shù)據(jù)位置的position寝姿,但是實(shí)際大家應(yīng)該知道,這個(gè)是不確定的划滋,如果RecyclerViewHeaderView饵筑,這個(gè)東西就會(huì)存在偏差,造成刷新錯(cuò)誤

diffResult.dispatchUpdatesTo(mAdapter);

public void dispatchUpdatesTo(final RecyclerView.Adapter adapter) {
    dispatchUpdatesTo(new ListUpdateCallback() {
        @Override
        public void onInserted(int position, int count) {
            adapter.notifyItemRangeInserted(position, count);
        }
        @Override
        public void onRemoved(int position, int count) {
            adapter.notifyItemRangeRemoved(position, count);
        }
        @Override
        public void onMoved(int fromPosition, int toPosition) {
            adapter.notifyItemMoved(fromPosition, toPosition);
        }
        @Override
        public void onChanged(int position, int count, Object payload) {
            adapter.notifyItemRangeChanged(position, count, payload);
        }
    });
}

上面是DiffUtil的更新使用和DiffUtil的更新源碼处坪,在源碼中我們可以看到最終還是通過Adapternotify的各種方法取更新的根资,也就是說可以通過重寫這些方法去校正位置。然而很不幸的是這次在RecyclerView.Adapternotify的各種方法都是final的同窘,沒有辦法去重寫:

public final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) {
    mObservable.notifyItemRangeChanged(positionStart, itemCount, payload);
}

萬幸的是RecyclerView.AdapterDataObservable不是final的因此我們可以通過重寫來校正position的正確值

private class NotifyObserver extends RecyclerView.AdapterDataObserver {

    RecyclerView.AdapterDataObserver mDataObserver;

   int mHeaderSize;

    public NotifyObserver(RecyclerView.AdapterDataObserver dataObserver,int headerSize) {
        mDataObserver = dataObserver;
        mHeaderSize = headerSize;
    }
    @Override
    public void onChanged() {
        mDataObserver.onChanged();
    }
    @Override
    public void onItemRangeChanged(int positionStart, int itemCount) {
        mDataObserver.onItemRangeChanged(positionStart + mHeaderSize , itemCount);
    }
    @Override
    public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
        mDataObserver.onItemRangeChanged(positionStart + mHeaderSize , itemCount, payload);
    }
    @Override
    public void onItemRangeInserted(int positionStart, int itemCount) {
        mDataObserver.onItemRangeInserted(positionStart + mHeaderSize , itemCount);
    }
    @Override
    public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
        mDataObserver.onItemRangeMoved(fromPosition, toPosition, itemCount);
    }
    @Override
    public void onItemRangeRemoved(int positionStart, int itemCount) {
        mDataObserver.onItemRangeRemoved(positionStart + mHeaderSize , itemCount);
    }
}

使用這個(gè)類包裹一次Adapter本身的RecyclerView.AdapterDataObserver就可以繼續(xù)使用DiffUtil刷新RecyclerView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玄帕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子想邦,更是在濱河造成了極大的恐慌裤纹,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件案狠,死亡現(xiàn)場(chǎng)離奇詭異服傍,居然都是意外死亡钱雷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門吹零,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罩抗,“玉大人,你說我怎么就攤上這事灿椅√椎伲” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵茫蛹,是天一觀的道長(zhǎng)操刀。 經(jīng)常有香客問我,道長(zhǎng)婴洼,這世上最難降的妖魔是什么骨坑? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮柬采,結(jié)果婚禮上欢唾,老公的妹妹穿的比我還像新娘。我一直安慰自己粉捻,他們只是感情好礁遣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肩刃,像睡著了一般祟霍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上盈包,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天沸呐,我揣著相機(jī)與錄音,去河邊找鬼续语。 笑死垂谢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疮茄。 我是一名探鬼主播滥朱,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼力试!你這毒婦竟也來了徙邻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤畸裳,失蹤者是張志新(化名)和其女友劉穎缰犁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帅容,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年颇象,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并徘。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡遣钳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出麦乞,到底是詐尸還是另有隱情蕴茴,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布姐直,位于F島的核電站倦淀,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏声畏。R本人自食惡果不足惜撞叽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望砰识。 院中可真熱鬧能扒,春花似錦佣渴、人聲如沸辫狼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膨处。三九已至,卻和暖如春砂竖,著一層夾襖步出監(jiān)牢的瞬間真椿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工乎澄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留突硝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓置济,卻偏偏與公主長(zhǎng)得像解恰,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浙于,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 又到了更新博文的時(shí)間了护盈,最近在看一本很不錯(cuò)的心理學(xué)書籍,名字叫做 《拖延心理學(xué)》羞酗,封面長(zhǎng)下面這樣子 書的內(nèi)容主要是...
    ec95b5891948閱讀 57,471評(píng)論 38 472
  • 過去的這一兩年腐宋, RecyclerView越來越引起了我們Android開發(fā)人員的注意,RecyclerView的...
    OlivineVip閱讀 1,262評(píng)論 0 14
  • 時(shí)光冉冉,你是否念想,那曾流失的每分每秒胸竞。 夕陽倒影的那片暈紅欺嗤,好像是我在流逝的那些年里,所感覺的那種顏色卫枝。不懂得...
    Luocong閱讀 218評(píng)論 0 0
  • 以上是我的一位壇友寫的即將回家的感受剂府。 對(duì)于過年,每人境遇不同剃盾,感觸也就各不相同腺占。有人歡喜,有人愁痒谴,...
    懂我笑容任閱讀 164評(píng)論 2 1