在使用RecyclerView或者閱讀其源碼前最好明確一些術語代表的概念,脫離具體實現細節,在抽象設計層思考RecyclerView 背後的模型。
先以RecyclerView的一個表現形式,一個可以上下滑動的列表作爲切入點: 我們爲什麼偏向使用ListView/RecyclerView而非ScrollView+LinearLayout作爲列表的實現方案? 因爲列表的長度可能是很長的。從理想的使用角度看,一個LinearLayout當然可以容納下數量龐大的ChildView來模擬一個長列表,不過現實中設備的內存是有限的,不可能爲View無限分配空間。這樣ListView出現了,它取巧的一點在於: 從感知上看,用戶能看到的只是長列表的一部分(當然了,如果世界上存在屏幕非常非常長(100米長,哈?)的手機,ListView也沒轍),列表自身只是一段數據, View是列表項展示的載體而非概念上的列表項,一個屬於數據層,一個屬於展示層。我們只需根據列表的內容將用戶當前可以觀察到的部分用View展現出來就能在感知上模擬出一個長列表 即使列表再長,受限於實際的展示區域,View的數量不會隨着列表長度增加而增加。進一步爲了優化性能,空間換時間,又引入了View回收複用機制。
上述ListView的解決方案規避了無限View問題。不過同時,一個分裂也被製造出來了:
- LinearLayout中的ChildView和整體列表項是一一對應的
- ListView在穩定狀態下,可以做到ChildView對應一部分列表項, 但是一旦有數據改變(不穩定狀態),在數據改變到ListView根據新數據刷新界面完畢的這個時間段內, ChildView的數據映射關係和新的數據是不一致的
RecyclerView的一些概念:
- 穩定態: 數據和展示一致。
- 不穩定態: 數據變化,展示還沒有刷新完,數據和展示不一致的階段。
- Item: 列表項,屬於一個列表,一個抽象層概念,View只是Item的展示載體, Item既有對應數據, 又可以有對應的View。 在RecyclerView中,ViewHolder就是Item的落地實現,RecyclerView在大多數概念級操作中,只關注ViewHolder,不關注ViewHolder對應的View,因爲概念層的操作不應該涉及到展現層
- Position: Item在列表(算是數據層吧)中的位置.
- Index: View層概念,ChildView在ViewGroup中的索引。
- AdapterPosition: 同Position,RecyclerView這樣稱呼是因爲Adapter算是Data在RecyclerView的代言人。
- LayoutPosition: 一個Item在上一次佈局結束時在Data中的位置。
- LayoutPosition和AdapterPosition是矛盾的一體,大多時候(穩定態)item的這兩個屬性是相同的,但在不穩定狀態下, 因爲數據層發生了變化,視圖還沒有來得及刷新,導致Item在數據層的位置(AdapterPosition)已經被更新(因爲數據確實已經改變了)了,但是LayoutPosition這個代表着最近一次佈局結束後Item的Position需要等待刷新完畢才能更新,兩者在這個時間段,是不一致的。 在視圖根據新的數據刷新後,兩者恢復一致,進入穩定態。這兩個Position,在一次刷新過程中,都是需要的,
- 對Adapter來說(Data角度),AdapterPosition代表現在,LayoutPosition代表過去。
- 對RecyclerView來說(可以理解爲View角度),LayoutPosition代表現在,AdapterPosition代表將來。
關於RecyclerView的一些概念
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.