照例,首先貼出本文檔所記課程的網址:http://coding.imooc.com/learn/list/100.html
1、ListView原理簡析
RecyclerView是ListView的替代者,為了弄清楚RecyclerView的工作原理,先弄清楚較為簡單的ListView的工作原理很有必要。
1.1、適配器模式
所謂適配器模式是把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。對于ListView和RecyclerView來說,其主要使用的是對象適配器模式(通過組合方式實現),對象適配器模式類圖如下:
從圖中可以看出,所謂適配器模式,就是適配器(Adapter)將被適配者(Adaptee)轉為為客戶所需要的目的接口(Target)。比如,有一個220V的電壓輸入,為了給一個電壓為5V的手機充電,那么必須通過一個適配器將這220V的電壓轉換為5V才可以供用戶使用。
適配器模式的使用場景:通常應用于進行不兼容的類型轉換的場景。
1.2、ListView適配器模式
ListView并不操作單個視圖和數據,這是因為,ListView會面對各種各樣的數據和View,因此,ListView將每個Item的View抽離出來,由Adapter去填充數據和視圖,然后再由ListView調用。在這個過程中,需要顯示的數據集合和ItemView就是Adaptee,ListView就是Client,所有Adapter都實現了BaseAdapter(Target)接口。
可以這樣說,Adapter是實現了視圖與數據分離的橋梁,其功能是將數據繪制到相對應的item上。
1.3、ListView的recyclerBin機制
ListView中管理的元素是View,ListView管理每個由Adapter返回的View,并將之加入RecyclerBin機制中,以此可以得以復用已加載過的View,以提高效率。其邏輯如下圖:
1.4、ListView的優化
為了重用convertView,使用ViewHolder。這個屬于經驗寫法。此處不贅。
2、RecyclerView原理簡析
RecyclerView和ListView一樣,也是通過Adapter將視圖和數據分離出來。由RecyclerView管理每個元素,但在這里的元素,不是ListView中的View,而是ViewHolder。因此RecyclerView與一下幾個類有關。
2.1、ViewHolder
RecyclerView里面管理的元素已經不是View而是ViewHolder了,因此,Android規定我們的具體ViewHolder必須繼承給定ViewHolder抽象類。每個ViewHolder保存相應的視圖和數據,并自己顯示。
2.2、RecyclerView.Adapter
這是適配器模式中的Target,我們必須定義具體的Adapter繼承之。類似于ListView中Adapter需要返回相應的View一樣,此處也需要返回相應的ViewHolder,具體的ViewHolder類型通過泛型的方式注入到Adapter中。Adapter中有幾個關鍵的方法:
1、getItemCount()
返回Item的數量,通過數據集合的個數獲得。以此確定Viewholder的數量。
2、getItemViewType(int position)
通過Item的位置確定該位置的ViewHolder的類型,以此區分不同的Item。
3、onCreateViewHolder()
根據相應的ViewType創建相應的視圖,并將該視圖綁定到一個新的ViewHolder并返回。
4、onBindViewHolder()
該方法里面,主要是將數據綁定到對應的ViewHolder上。onCreateViewHolder()方法和該方法類似于ListView中的getView()。
2.3、LayoutManager
RecyclerView并不像ListView規定里面的Item只能以某種方式布局,RecyclerView可以將里面的Item以各種各樣的方式放置,這是通過LayoutManager做到的。不同的LayoutManager可以使ViewHolder以不同的方式呈現。比如LinearLayoutManager使之呈線性,而GridLayoutManager使之呈網格,我們也可以定義自己的LayoutManager。
2.4、緩存與復用
RecyclerView也有它自己的復用機制,是通過多加載幾個ViewHolder以備用,而劃出去的ViewHolder則放入復用池中。這對于使用RecyclerView來說并非重點,此處不贅。