RecyclerView內(nèi)部BUG: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position

一刁憋、BUG出現(xiàn)的日志:
1.情況描述:
項目剛更新了一個小版本,新增了一個上拉刷新和下拉加載的頁面,因為原來的RecyclerView的刷新框架我覺著不好,于是就換了一個撵儿,然后在對RCView數(shù)據(jù)處理的時候,處理的方式和以前是一樣的狐血,在測試機上測試也未出現(xiàn)BUG淀歇,但是上線之后,爆出了BUG匈织,而且影響人數(shù)還很多浪默,于是趕緊查了一下,出現(xiàn)的BUG的相關(guān)原因,并解決了它浴鸿。附上:BUG的Log

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 150(offset:150).state:153
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5504)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583)
    at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312)
    at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1618)
    at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4702)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:686)
    at android.view.Choreographer.doFrame(Choreographer.java:619)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:7409)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

2.BUG出現(xiàn)的原因:
因為由崩潰LOG看井氢,屬于RcyclerView使用出現(xiàn)的bug,經(jīng)過多次google相關(guān),總結(jié)出了原因:
就是在進行數(shù)據(jù)移除和數(shù)據(jù)增加時岳链,務(wù)必要保證Adapter中的數(shù)據(jù)和移除的數(shù)據(jù)保持一致花竞!這是什么意思呢?就是如果你更新你的集合后掸哑,調(diào)用Adapter的新出現(xiàn)的notifyxxxx方法時约急,adapter 的更新預(yù)期結(jié)果和實際集合更新結(jié)果不同,那么就會出現(xiàn)異常了苗分。
例如: 比如你集合remove了兩條數(shù)據(jù)厌蔽,但是你Adapter只notifyItemRemoved(2)(這里表示移除第三條數(shù)據(jù),只移除了一條)摔癣,這種情況舊屬于數(shù)據(jù)不一致了奴饮。還有一種是你增加數(shù)據(jù),你集合增加10條數(shù)據(jù)择浊,但是你Adapter的notify只增加了5條數(shù)據(jù)戴卜,這也是數(shù)據(jù)不一致。
好了琢岩,通過以上兩種情況投剥,大概就知道了,這個數(shù)據(jù)一致其實說的是要保證數(shù)量一致担孔。就是說Adapter有個size江锨,你的集合有個size。這兩個size糕篇,在調(diào)用Adapter的notifyxxxx時候必須保持相同啄育。
看到此處,你應(yīng)該明白了吧拌消!
3.解決方案:
網(wǎng)上有很多解決此類的方案灸撰,我擇優(yōu)選擇了最靠譜的解決方案,就是復(fù)寫LinearLayoutManager這個類拼坎,代碼如下:

public class RecyclerViewNoBugLinearLayoutManager extends LinearLayoutManager {
    public RecyclerViewNoBugLinearLayoutManager(Context context) {
        super( context );
    }

    public RecyclerViewNoBugLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super( context, orientation, reverseLayout );
    }

    public RecyclerViewNoBugLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super( context, attrs, defStyleAttr, defStyleRes );
    }

    @Override
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
        try {
        //try catch一下
            super.onLayoutChildren( recycler, state );
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
        }

    }
}

這樣就有效避免了解決RecyclerView可能出現(xiàn)的holder數(shù)組越界Bug浮毯。

下面幾篇文章,是另外幾篇關(guān)于此BUG的處理泰鸡。
https://stackoverflow.com/questions/30458640/recyclerview-java-lang-indexoutofboundsexception-inconsistency-detected-inval
http://www.cnblogs.com/fuyaozhishang/p/6991221.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末债蓝,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子盛龄,更是在濱河造成了極大的恐慌饰迹,老刑警劉巖芳誓,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啊鸭,居然都是意外死亡锹淌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門赠制,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赂摆,“玉大人,你說我怎么就攤上這事钟些⊙毯牛” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵政恍,是天一觀的道長汪拥。 經(jīng)常有香客問我,道長篙耗,這世上最難降的妖魔是什么迫筑? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宗弯,結(jié)果婚禮上脯燃,老公的妹妹穿的比我還像新娘。我一直安慰自己罕伯,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布叽讳。 她就那樣靜靜地躺著追他,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岛蚤。 梳的紋絲不亂的頭發(fā)上邑狸,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音涤妒,去河邊找鬼单雾。 笑死,一個胖子當(dāng)著我的面吹牛她紫,可吹牛的內(nèi)容都是我干的硅堆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼贿讹,長吁一口氣:“原來是場噩夢啊……” “哼渐逃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起民褂,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤茄菊,失蹤者是張志新(化名)和其女友劉穎疯潭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體面殖,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡竖哩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脊僚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片相叁。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吃挑,靈堂內(nèi)的尸體忽然破棺而出钝荡,到底是詐尸還是另有隱情,我是刑警寧澤舶衬,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布埠通,位于F島的核電站,受9級特大地震影響逛犹,放射性物質(zhì)發(fā)生泄漏端辱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一虽画、第九天 我趴在偏房一處隱蔽的房頂上張望舞蔽。 院中可真熱鬧,春花似錦码撰、人聲如沸渗柿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽朵栖。三九已至,卻和暖如春柴梆,著一層夾襖步出監(jiān)牢的瞬間陨溅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工绍在, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留门扇,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓偿渡,卻偏偏與公主長得像臼寄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溜宽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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