RecyclerView相關(guān)的文章預(yù)計(jì)會(huì)寫六篇肚菠,此處是第一篇
- RecyclerView中的position
- RecyclerView中的DiffUtil
- RecyclerView中的SnapHelper
- RecyclerView中的Selection
- RecyclerView中的ConcatAdapter
- RecyclerView中的Glide預(yù)加載
- RecyclerView源碼淺析
在recyclerview中有兩種類型的position:
- layout position:這是從LayoutManager視角看到的position时捌,它是item在布局中最新的計(jì)算位置奢讨;
- adapter position:這是從adapter視角看到的position塞茅,它是item在adapter中的位置;
這兩種position在絕大多數(shù)情況下是相同的吏廉,除了adapter notify調(diào)用之后到布局計(jì)算完成之前,這兩個(gè)position可能存在偏差。
- RecyclerView.ViewHolder#getLayoutPosition返回viewholder在最新布局中的位置畦戒。這個(gè)位置主要由RecyclerView組件使用,以便在RecyclerView延遲處理適配器更新時(shí)保持一致邀层。
- RecyclerView#findViewHolderForLayoutPosition(int position)返回在最新布局中給定位置的ViewHolder涛目。
如果你想獲取用戶在屏幕上看到的item估蹄,建議使用以上兩種方式讯赏。
-
RecyclerView.ViewHolder#getAbsoluteAdapterPosition返回item在adapter中的位置,這個(gè)位置是相對(duì)于RecyclerView的adapter的。這個(gè)值和getLayoutPosition可能不同垢村,在布局未更新之前。RecyclerView不會(huì)處理任何更新直到下一次布局遍歷麻昼,這會(huì)導(dǎo)致在用戶從屏幕中看到的內(nèi)容和adapter實(shí)際內(nèi)容之間短暫的不一致。這個(gè)短暫的瞬間一般小于16ms。
如果你觸發(fā)了notifyDataSetChanged,直到下一次布局更新完成,該方法返回值都會(huì)是NO_POSITION。 - RecyclerView.ViewHolder#getAdapterPosition該方法已經(jīng)廢棄了,在嵌套的adapter中亲桥,該方法的返回值是不準(zhǔn)確的厅目。
- RecyclerView.ViewHolder#getBindingAdapterPosition 返回此 ViewHolder 的item在adapter中的位置拗馒,這個(gè)位置是相對(duì)于綁定它的適配器的位置。如果您正在查詢?cè)L問適配器內(nèi)容的位置友绝,您應(yīng)該使用 getBindingAdapterPosition。
getAbsoluteAdapterPosition和getBindingAdapterPosition基本一致,只不過前者是相對(duì)于RecyclerView的,后者是相對(duì)于adapter的缰冤。
相對(duì)位置和絕對(duì)位置.png
引用這幅圖可以幫助我們很好的理解兩者的區(qū)別。
總結(jié)一下:
layout position 和adapter position在大多數(shù)情況下是一致的畦攘,只是在RecyclerView刷新不及時(shí)兩者可能存在偏差叹螟,如果想獲取用戶真實(shí)看到的內(nèi)容有缆,建議使用Layout position栈虚。adapter position因?yàn)榇嬖赾ontact adapter的情況分為相對(duì)位置和絕對(duì)位置粘姜,如果我們用不到contact adapter豺裆,兩者可以認(rèn)為是一樣的蔑歌。
參考:
1劫灶、RecyclerView
2滞详、「RecyclerView中的位置」你真的會(huì)正確獲取Item的位置么岸啡?