1. 程式人生 > >RecyclerView內部Bug???別急,我們慢慢解決它~

RecyclerView內部Bug???別急,我們慢慢解決它~

正文

回到頂部

一、寫在前面

       這也是久違的一整個月沒有寫Blog,也是由於近期給妹紙找工作,各種坑蒙拐騙,然而都沒卵用。額,廣大朋友們,成都需要軟體測試、線上運維、產品助理的夥伴,趕緊私聊我了。這妹紙,學習能力挺好,資質也不錯,專業成績總體排名年級第二,保送研究生(近期已決定放棄),心動不如行動,晚了就沒機會了,趕緊私信我吧。

  該文章同步釋出到:

回到頂部

二、驚現 RecyclerView 內部bug?

      扯淡就不扯淡了,咱們還是說說這個早就可能被寫爛吐槽的RecyclerView的bug吧。

      不知道你們遇見沒有,在RecyclerView被推的如火如荼的時候,你喜歡它,你默默用它,甚至對它的健壯性(艹,這樣也算是性、愛)

愛不釋手。你覺得,這玩意兒都出來這麼久了,一定沒問題。額,沒毛病。然而,在某一次快速滑動中,Boom,崩潰了!瞬間打臉。

     檢視Log得到下面的玩意兒。

複製程式碼
 1 java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 157(offset:157).state:588
 2         at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3300)
 3
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:3258) 4 at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1803) 5 at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1302)
6 at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1265) 7 at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1093) 8 at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:956) 9 at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:2715) 10 at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 11 at android.view.Choreographer.doCallbacks(Choreographer.java:555) 12 at android.view.Choreographer.doFrame(Choreographer.java:524) 13 at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 14 at android.os.Handler.handleCallback(Handler.java:615) 15 at android.os.Handler.dispatchMessage(Handler.java:92) 16 at android.os.Looper.loop(Looper.java:137) 17 at android.app.ActivityThread.main(ActivityThread.java:4921) 18 at java.lang.reflect.Method.invokeNative(Native Method) 19 at java.lang.reflect.Method.invoke(Method.java:511) 20 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 21 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 22 at dalvik.system.NativeStart.main(Native Method)
複製程式碼

    雜一看像是陣列越界?NO NO NO,這日誌看上去根本就跟我們程式碼無關呀。多番Google發現,這貌似是Google程式設計師的鍋?內部bug?這TM官方的問題,關你何事?要不咱們不用RecyclerView了吧?

    你是一個優秀的程式猿,不應該總是逃避問題,而應該思考如何去解決它。不過這說明了一個問題,人非聖賢孰能無過,連Google程式設計師那麼牛逼的存在都會出問題,我們是不是......嘿嘿。

    這玩意兒崩潰的原因比較清楚,就是如果繫結的集合List中的資料和RecycerView的資料不一致的時候,呼叫更新方法的時候會復現。

回到頂部

三、怎麼解決?

    有人這麼說,造成崩潰的原因極有可能是當clear了之後,迅速上滑,但由於新資料還沒來,導致RecyclerView需要更新載入下面的Item的時候,找不到資料來源,導致了崩潰的發生。

    所以,既然如此,一定可以通過讓Clear的時候,禁止RecyclerView的滑動來解決它。程式碼如下:

複製程式碼
 1 private boolean mIsRefreshing=false;
 2 mRecyclerView.setOnTouchListener(
 3     new View.OnTouchListener() {
 4       @Override
 5       public boolean onTouch(View v, MotionEvent event) {
 6         if (mIsRefreshing) {
 7           return true;
 8         } else {
 9           return false;
10         }
11       }
12     }
13 );
14 //當重新整理時設定
15 //mIsRefreshing=true;
16 //重新整理完畢後還原為false
17 //mIsRefreshing=false;
複製程式碼 回到頂部

四、其它人的意見

      人,想法,總是千奇百怪。

      造成崩潰的原因其實很明顯,如果你更新集合List後,呼叫RVAdapter的notifyXXXX方法時,adapter的更新預期介面和實際集合更新結果不同,就會出現這個異常!不信你可以隨便模擬這個情況的發生。

      所以有人就得到了這樣的結論:

      1、RVAdapter的notifyDataSetChanged方法執行後,在一定時間內,如果你更新了你的集合(無論是否在主執行緒更新集合),那麼這個更新會實時反應到控制元件上,也就是說你的控制元件顯示也會更新。

      2、呼叫諸如notifyItemRangeInserted這樣的方法之前,考慮清楚你的集合到底更新成什麼樣了!要注意參考結論1,結論1會影響你的判斷。

回到頂部

五、解決該問題的正確姿勢?

     顯然,上面的方法都不太好用,繼續研究發現,直接採用下面的方法可以很好的解決。

     經過多番研究發現,直接像下面這樣,可以完美解決我們的問題。

    1、複寫LinearLayoutManager

複製程式碼
 1 package com.zxedu.ischool.common;
 2 
 3 import android.content.Context;
 4 import android.support.v7.widget.LinearLayoutManager;
 5 import android.support.v7.widget.RecyclerView;
 6 import android.util.AttributeSet;
 7 
 8 /**
 9  * Author: nanchen
10  * Email: [email protected]
11  * Date: 2017-05-19  15:56
12  */
13 
14 public class WrapContentLinearLayoutManager extends LinearLayoutManager {
15     public WrapContentLinearLayoutManager(Context context) {
16         super(context);
17     }
18 
19     public WrapContentLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
20         super(context, orientation, reverseLayout);
21     }
22 
23     public WrapContentLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
24         super(context, attrs, defStyleAttr, defStyleRes);
25     }
26 
27     @Override
28     public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
29         try {
30             super.onLayoutChildren(recycler, state);
31         } catch (IndexOutOfBoundsException e) {
32             e.printStackTrace();
33         }
34     }
35 }
複製程式碼

       2、對,沒錯,直接更換LayoutManaer就OK了

1 //        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
2         // 解決RecyclerView可能出現的holder陣列越界Bug
3         mRecyclerView.setLayoutManager(new WrapContentLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
回到頂部

六、寫在最後

     請別問我為什麼這樣就能解決?我會大聲告訴你,我也不知道!

     我能怎麼辦,我也很無奈~

相關推薦

RecyclerView內部Bug???我們慢慢解決~

正文 回到頂部 一、寫在前面        這也是久違的一整個月沒有寫Blog,也是由於近期給妹紙找工作,各種坑蒙拐騙,然而都沒卵用。額,廣大朋友們,成都需要軟體測試、線上運維、產品助理的夥伴,趕緊私聊我了。這妹紙,學習能力挺好,資質也不錯,專業成績總體排名年級

#程式設計師被倒掛薪資被應屆生超過!網友:明年有比他高的

行內人都知道,在網際網路行業中,有一個奇怪的現象:老闆寧願花更高的價錢招聘新人,都不願意給老員工漲薪,甚至有的應屆生薪資都比工作了兩三年的老員工要高!這種情況久讓很多老員工心中非常不平衡:我辛辛苦苦工作這麼久,薪資竟然還不如一個應屆生? 如果有想學習java的程式設計師,可來我們的java學習扣

程式設計師被倒掛薪資被應屆生超過!網友:明年有比他高的

行內人都知道,在網際網路行業中,有一個奇怪的現象:老闆寧願花更高的價錢招聘新人,都不願意給老員工漲薪,甚至有的應屆生薪資都比工作了兩三年的老員工要高!這種情況久讓很多老員工心中非常不平衡:我辛辛苦苦工作這麼久,薪資竟然還不如一個應屆生? 這位程式設計師久遇到了這樣的情況,一個剛畢業的應屆生

會議記錄記不完整?手機錄音轉文字分分鐘幫你搞定!

日常工作中,各種會議記錄是必不可少的,但是手寫上的速度永遠跟不上說話的速度,所以會議記錄經常記不完整,老闆還說你效率低,該怎麼辦呢?下面小編教大家一招,用手機錄音就可以做一個完整的會議記錄,一起來學習一下吧! 使用工具:錄音轉文字助手APP,一款可以將語音檔案、錄音檔案轉換為文字的軟體。 使用裝置:安卓、

稅改恐慌癥?SAP 增強薪資方案助力 HR 擁抱稅改元年

我們 機制 優惠 進行 .com mark 薪資 準備 哪些 眾所周知,自×××常務委員會於2018年8月31日批準了《×××個人所得稅法》第七次修正案後,有關個稅改革的話題,就成為朋友圈不得不說的一大熱點事件。其中人們最關心的,莫過於在2019年1月1日正式施行的有關個稅

拼好貨和拼多多我們來談談的供應鏈

協商 聯系 擁有 生產 建立 吸引力 訂單 一點 消費 水果是一門非常依賴口碑傳播的生意。對“拼好貨”來說,用戶拼單的過程,相當於為平臺做了免費的推廣。根據拼好貨的公開說法,“拼好貨”幾乎沒有做過用戶補貼,在市場推廣上的花費也趨近於零,整體依靠口碑傳播。截止2016

當activity改變時我們如何處理

速度 change 假設 IT super conf In develop aras 用戶和系統觸發-的事件,可能造成一個activity狀體的改變。這個文檔描述了一些常見的情況,和如何去處理這些改變。 原網站:https://developer.android.googl

9/20:才疏學淺製作了一個很low的js原生選項卡隨著學習的深入我會慢慢完善

 關鍵在於this,此處用於當前物件 JavaScript中的this含義非常豐富,它可以是全域性物件,當前物件或者是任意物件,這都取決於函式的呼叫方式。 函式有以下幾種呼叫方式:作為物件方法呼叫、作為函式呼叫、作為建構函式呼叫、apply或call呼叫。 <!DO

ACMNO.47 矩形面積交(有圖) 平面上有兩個矩形它們的邊平行於直角座標系的X軸或Y軸。對於每個矩形我們給出的一對相對頂點的座標請你程式設計算出兩個矩形的交的面積。

題目描述 平面上有兩個矩形,它們的邊平行於直角座標系的X軸或Y軸。 對於每個矩形,我們給出它的一對相對頂點的座標,請你程式設計算出兩個矩形的交的面積。 輸入 輸入僅包含兩行,每行描述一個矩形。 在每行中,給出矩形的一對相對頂點的座標,每個點的座標都用兩個絕對值不超過10^7的

Spring拓展介面之BeanPostProcessor我們來看看的底層實現

前言   開心一刻     小明:“媽,我被公司開除了”,媽:“啊,為什麼呀?”, 小明:“我罵董事長是笨蛋,公司召開高層會議還要起訴我”,媽:“告你誹謗是吧?”,小明:“不是,他們說要告我洩露公司

ES2020 系列:可選鏈 "?." 為啥出現我們能用來幹啥?

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18d583c0d4084119a03ba18e1e8b99a6~tplv-k3u1fbpfcp-zoom-1.image) # 可選鏈 "?." 可選鏈 `?.` 是一種訪問巢狀物件屬性的安全的方

再關心AI怎麽好了我們要搞懂AI怎麽用

ant 坐標 rgb weight 部分 基本 安利 世界 ali 在今天的中國,想要了解AI,最怕的是什麽?答案也許只有一個,那就是開會。如今的人工智能大會基本是有套路的:首先要提問AI到底會不會取代人類;然後各個專家發言,暢想一下AI的美好未來;最後炫一張復雜的PPT或

【軟件測試】程序不改bug動手聽我說

開發 誤報 鏈接 為什麽 場景 真的 技術管理 產品 工具 前言 今天的話題,是所有測試員都會經歷的,也多為此苦惱過。墨白借此談談自己的看法,不求解決現狀,只希望大家看完此文後能少一些苦惱。 現狀分析 之前,墨白身邊一位測試老人提了一個打印文字溢出的缺陷,但該缺陷的負責人

程式設計師因程式碼產出少遭強制開除!網友建議:上班幹活不給錢就Bug

現在的網際網路公司都是根據員工的能力來分配薪資的,尤其是程式設計師這樣的技術行業,有程式碼有效的前提下,如果程式碼產出量高,證明開發專案快,所以工作效率就高,那麼薪水自然會比較高。反之如果程式碼產出少,工作效率就低很多。 如果有想學習java的程式設計師,可來我們的java學習扣qun:7997

程式設計真可怕我們日常都在寫 Bug

作為開發者,我們一直走在寫 Bug 的路上,而什麼樣的程式碼才是最好的?又該如何掌握除錯的正確姿

開發說你提交的bug 是非問題這個時候我們怎麼處理?

1、首先明確開發說不是bug的理由,2、如果是需求變更, 那就找產品經理確認是否是需求變更 3、如果開發說測試環境問題, 讓他說明清楚測試環境問題是什麼,我按照他說的驗證一遍, 如果確實如他所說, 那就

線上出bug了?這麼定位!

摘要: Source Map還是很神奇的。 原文:線上出bug了?別怕,這麼定位! 公眾號:前端小苑 Fundebug經授權轉

【拿來主義】當我們談WEB緩存的時候我們在談些什麽?

1.0 服務器端 過程 用戶 重定向 new nac java style 第一部分 Web緩存是什麽 場景1:測試妹子測功能時會說為什麽我的瀏覽器的顯示亂七八糟,我的界面怎麽跟別人瀏覽器上不一致?旁邊的人會提醒說:清下緩存試試。 場景2:開發改了代碼,上了環境,發現不

那些年那些事兒我們一起php

做出 幹凈 程序員 彈出 高考 那種 家務 每次 哥哥 謹以此文悼念自己的堅持了8年的初戀以及逝去的青春。 晚上七點,寫完日報,上傳今天更新的代碼。簡單的收拾,擠上了回家的地鐵,天氣慢慢變熱了,地鐵中的味道也豐富了起來。站在角落,拿出手機,也就這段時間我可以玩

'mingw32-make' 不是內部或外部命令也不是可運行的程序 或批處理文件。(的解決方案)

windows 外部命令 搜索 方案 win mage -m 分享 image 問題如上。 解決方案:找到mingw32-make,方法是在計算中搜索 然後將其復制到C:Windows\System32下,需要管理員權限才能復制的情況下直接點繼續。然後就可以了。