在使用RecylerView 的notifyItemChanged(int itemPosition)方法時(shí),由于緩存引起的異常

java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder{869416e position=0 id=-1, oldPos=-1, pLpos:-1}

? ? ? ? ? at android.support.v7.widget.RecyclerView$5.attachViewToParent(RecyclerView.java:774)

? ? ? ? ? at android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:239)

? ? ? ? ? at android.support.v7.widget.RecyclerView.addAnimatingView(RecyclerView.java:1285)

? ? ? ? ? at android.support.v7.widget.RecyclerView.animateChange(RecyclerView.java:3854)

? ? ? Called attach on a child which is not detached意思大概是,當(dāng)前viewholder不是被綁定的(detached)。

由于RecyclerView緩存機(jī)制,未在屏幕上顯示的item會(huì)被暫時(shí)收回,即detached,所以當(dāng)調(diào)用notifyItemChanged()?時(shí),如果item不在屏幕中,就會(huì)導(dǎo)致Called attach on a child which is not detached錯(cuò)誤,還有另外一個(gè)相關(guān)的知識(shí)點(diǎn):mLayoutManager.getChildCount();?方法返回的是當(dāng)前顯示的item個(gè)數(shù),并不是adapter所有item的數(shù)量。

? ? ? 既然明白問(wèn)題的出處,那需要判斷當(dāng)前position是否在屏幕中顯示即可,LayoutManager給我們提供了相應(yīng)的方法來(lái)判斷position是否在屏幕中,我們可以通過(guò)LayoutManager獲得當(dāng)前屏幕顯示的第一個(gè)item位置,以及最后一個(gè)item位置,注意該位置是整個(gè)list中的位置 ,當(dāng)滿足position<=lastindex && position>=firstIndex?時(shí),說(shuō)明item在屏幕中,即可安心的使用notifyItemChanged()?。如果RecyclerView可以下拉刷新或添加頭部視圖,position = 0的位置可能是下拉刷新視圖或頭部視圖,那么需要根據(jù)存儲(chǔ)到成員變量preindex?中的值來(lái)計(jì)算要需要更新的item位置:int updatePos = preIndex - firstVisibleItemPosition+1,即正確位置。

示例:

//第一個(gè)可見(jiàn)的位置

? int firstVisiblePosition = ((LinearLayoutManager) mRecyclerViewOrder.getLayoutManager()).findFirstVisibleItemPosition();

//頭部不跟新

? firstVisiblePosition = firstVisiblePosition == 0 ? (firstVisiblePosition + 1) : firstVisiblePosition;

//最后一個(gè)可見(jiàn)的位置

? ? int lastVisiblePosition = ((LinearLayoutManager) mRecyclerViewOrder.getLayoutManager()).findLastVisibleItemPosition();

? ? if (mItemPosition - firstVisiblePosition >= 0 && mItemPosition <= lastVisiblePosition)

? ? ? ? ? ? ? ? myOrderTradeAdapter.notifyItemChanged(mItemPosition);//更新數(shù)據(jù)

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 【Android 控件 RecyclerView】 概述 RecyclerView是什么 從Android 5.0...
    Rtia閱讀 308,446評(píng)論 27 440
  • 本篇文章已授權(quán)微信公眾號(hào) dasu_Android(大蘇)獨(dú)家發(fā)布 最近打算花點(diǎn)精力來(lái)研究 RecyclerVie...
    請(qǐng)叫我大蘇閱讀 47,367評(píng)論 14 237
  • 冷和熱的切換讓皮膚有種酥麻的感覺(jué),原先的緊繃感被皺紋感代替,隨后是血管的暖意蔓延到毛孔,臉頰和手迅速升溫,竟讓我有...
    司木先生閱讀 472評(píng)論 7 3
  • 適應(yīng)生活是每一個(gè)人必須需要學(xué)會(huì)的。的確行動(dòng)起來(lái)。我不是左耳朵進(jìn)右耳朵出來(lái)。我知道這個(gè)的重要性每一個(gè)人必備的生存法則...
    zsdert閱讀 444評(píng)論 0 0
  • Author:杜七 Date:2017.04.18 轉(zhuǎn)載自: 模型思維 1 | 課程概述 This is a tr...
    杜七閱讀 2,093評(píng)論 4 12

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