http://www.itdecent.cn/p/83506d1d1ec8
背景:首頁(yè)小說(shuō)流頁(yè)面,長(zhǎng)按小說(shuō)item刪除,
mDatas.remove(E)
adapter.notifyItemRemoved(position);
只是移除單個(gè)item,沒(méi)有刷新界面,此時(shí)position的信息沒(méi)有更新
比如,刪除pos = 1,在刪除補(bǔ)上來(lái)的item,pos此時(shí)為2,應(yīng)該為1,此時(shí)用getAdapterPosition,它更新了;
getLayoutPosition 和 getAdapterPosition 通常情況下是一樣的,只有當(dāng) Adapter 里面的內(nèi)容改變了,而 Layout 還沒(méi)來(lái)得及繪制的這段時(shí)間之內(nèi)才有可能不一樣,這個(gè)時(shí)間小于16ms
如果調(diào)用的是 notifyDataSetChanged(),因?yàn)橐匦吕L制所有 Item,所以在繪制完成之前 RecyclerView 是不知道 adapterPosition 的,這時(shí)會(huì)返回-1(NO_POSITION)
但如果用的是 notifyItemInserted(0),那立即就能獲取到正確的 adapterPosition,即使新的 Layout 還沒(méi)繪制完成,比如之前是0的現(xiàn)在就會(huì)變成1,因?yàn)椴迦肓?, 相當(dāng)于 RecyclerView 提前幫你計(jì)算的,此時(shí)getLayoutPosition 還只能獲取到舊的值。
總的來(lái)說(shuō),大多數(shù)情況下用 getAdapterPosition,只要不用 notifyDataSetChanged() 來(lái)刷新數(shù)據(jù)就總能立即獲取到正確 position 值。
什么情況下用 getLayoutPosition 呢?
就是調(diào)用 findViewHolderForLayoutPosition 獲取當(dāng)前點(diǎn)擊的 Item 的 ViewHolder 時(shí),因?yàn)榇藭r(shí) layout position 和用戶在屏幕上看到的一定是一樣的。