RecyclerView內部Bug???別急,我們慢慢解決它~
正文
回到頂部一、寫在前面
這也是久違的一整個月沒有寫Blog,也是由於近期給妹紙找工作,各種坑蒙拐騙,然而都沒卵用。額,廣大朋友們,成都需要軟體測試、線上運維、產品助理的夥伴,趕緊私聊我了。這妹紙,學習能力挺好,資質也不錯,專業成績總體排名年級第二,保送研究生(近期已決定放棄),心動不如行動,晚了就沒機會了,趕緊私信我吧。
該文章同步釋出到:
回到頂部二、驚現 RecyclerView 內部bug?
扯淡就不扯淡了,咱們還是說說這個早就可能被寫爛吐槽的RecyclerView的bug吧。
不知道你們遇見沒有,在RecyclerView被推的如火如荼的時候,你喜歡它,你默默用它,甚至對它的健壯性(艹,這樣也算是性、愛)
檢視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) 3at 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下,需要管理員權限才能復制的情況下直接點繼續。然後就可以了。