關於RecyclerView的一些概念

  1. 在使用RecyclerView或者閱讀其源碼前最好明確一些術語代表的概念,脫離具體實現細節,在抽象設計層思考RecyclerView 背後的模型。

  2. 先以RecyclerView的一個表現形式,一個可以上下滑動的列表作爲切入點: 我們爲什麼偏向使用ListView/RecyclerView而非ScrollView+LinearLayout作爲列表的實現方案? 因爲列表的長度可能是很長的。從理想的使用角度看,一個LinearLayout當然可以容納下數量龐大的ChildView來模擬一個長列表,不過現實中設備的內存是有限的,不可能爲View無限分配空間。這樣ListView出現了,它取巧的一點在於: 從感知上看,用戶能看到的只是長列表的一部分(當然了,如果世界上存在屏幕非常非常長(100米長,哈?)的手機,ListView也沒轍),列表自身只是一段數據, View是列表項展示的載體而非概念上的列表項,一個屬於數據層,一個屬於展示層。我們只需根據列表的內容將用戶當前可以觀察到的部分用View展現出來就能在感知上模擬出一個長列表 即使列表再長,受限於實際的展示區域,View的數量不會隨着列表長度增加而增加。進一步爲了優化性能,空間換時間,又引入了View回收複用機制

  3. 上述ListView的解決方案規避了無限View問題。不過同時,一個分裂也被製造出來了:

    • LinearLayout中的ChildView和整體列表項是一一對應的
    • ListView在穩定狀態下,可以做到ChildView對應一部分列表項, 但是一旦有數據改變(不穩定狀態),在數據改變到ListView根據新數據刷新界面完畢的這個時間段內, ChildView的數據映射關係和新的數據是不一致的
  4. RecyclerView的一些概念:

    1. 穩定態: 數據和展示一致。
    2. 不穩定態: 數據變化,展示還沒有刷新完,數據和展示不一致的階段。
    3. Item: 列表項,屬於一個列表,一個抽象層概念,View只是Item的展示載體, Item既有對應數據, 又可以有對應的View。 在RecyclerView中,ViewHolder就是Item的落地實現,RecyclerView在大多數概念級操作中,只關注ViewHolder,不關注ViewHolder對應的View,因爲概念層的操作不應該涉及到展現層
    4. Position: Item在列表(算是數據層吧)中的位置.
    5. Index: View層概念,ChildView在ViewGroup中的索引。
    6. AdapterPosition: 同Position,RecyclerView這樣稱呼是因爲Adapter算是Data在RecyclerView的代言人。
    7. LayoutPosition: 一個Item在上一次佈局結束時在Data中的位置。
    8. LayoutPosition和AdapterPosition是矛盾的一體,大多時候(穩定態)item的這兩個屬性是相同的,但在不穩定狀態下, 因爲數據層發生了變化,視圖還沒有來得及刷新,導致Item在數據層的位置(AdapterPosition)已經被更新(因爲數據確實已經改變了)了,但是LayoutPosition這個代表着最近一次佈局結束後Item的Position需要等待刷新完畢才能更新,兩者在這個時間段,是不一致的。 在視圖根據新的數據刷新後,兩者恢復一致,進入穩定態。這兩個Position,在一次刷新過程中,都是需要的
    9. 對Adapter來說(Data角度),AdapterPosition代表現在,LayoutPosition代表過去。
    10. 對RecyclerView來說(可以理解爲View角度),LayoutPosition代表現在,AdapterPosition代表將來。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章