自定義Adapter實現多檢視Item的ListView
From http://www.devdiv.com/adapter_item_listview-article-3730-1.html
1、原理分析
Adapter對於ListView是非常重要的,它處於listView和資料來源的中間,負責為ListView建立具體的檢視。之前提到過ListView採用了View複用技術,即使需要顯示大量的資料列表時它也能高效的工作,它總是試圖複用已經存在的View。
下面就對View複用技術,做簡單的講解:
簡單來說,假設一個ListView中存在7個Item,從上到下分別是Item1~Item7,當用戶向上滑動螢幕時,Item1會滾動到螢幕區域以外,item1並沒有被銷燬,而是被放入了回收站(Recycler)。當ListView需要顯示下一個item時,它會首先檢查回收站裡是否有可用的Item,剛好發現了item1,直接複用item1。ListView把獲取到的Item1和新的位置(position8)傳遞給Adapter的getView方法,在getView方法中根據position8從資料來源中取出對應的資料覆蓋到item1,這時item1就變成了item8。最後,ListView把新生成item8顯示到介面上。
而當ListView中存在不同檢視的Item的時候,Adapter中存在一個int getViewTypeCount()方法返回item使用的View型別的數量(預設為1)。listView根據Adapter的這個方法的返回值,在回收站中建立對應數量的儲存區域。而Adapter的int getItemViewType(int position):根據position獲取對應item使用的View型別。 ListView會在回收站中根據型別建立不同的儲存區域,listView會在呼叫Adapter 的getView方法之前,根據position獲取正確型別的View進行復用。
通過以上兩種方式,ListView實現了在單一Item檢視和多種Item檢視情況下,View的複用。
在上一次“ListView繫結EmptyView”的講解中,進行了簡單的Adapter的自定義實現,今天我們來講解在ListView中顯示不同時檢視的Item。如果只顯示單一檢視的Item,只需要重寫BaseAdapter的以下四個方法:
int getCount():返回資料來源中資料項的總數量
Object getItem(int position):根據position從資料來源中獲取資料項
long getItemId(int position): 根據position從資料來源中獲取資料項ID
View getView(int position, View convertView, ViewGroup parent):根據position建立View,它是Adapter中最重要的方法,listView通過它建立View。
這也是進行自定義Adapter時必須要重寫的方法。
要想實現多檢視的Item的ListView,還需要重寫Adapter的以下幾個方法(不是必須要重寫的):
int getViewTypeCount():返回item使用的View型別的數量,預設為1。
int getItemViewType(int position):根據position獲取對應item使用的View型別。
boolean isEnabled (int position):根據position設定對應的item是否可用,即是否能接收UI事件。
其中,getItemViewType和getViewTypeCount通常需要配對使用
2、示例分析
這次的Demo實現的效果是,根據單詞不同的首字母,在ListView中對字母進行分別顯示。其中,單詞的首字母作為各部分的分隔,使用不同於字母的顯示檢視。
因此在Demo中需要兩種不同風格的檢視。分別為: first_letter_item.xml,程式碼如下:
[程式碼]xml程式碼:
1 |
<!--?xml
version="1.0" encoding="utf-8"?--> |
2 |
< linearlayout xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:orientation = "vertical" > |
3 |
4 |
< textview android:id = "@+id/firstletter" style = "?android:attr/listSeparatorTextViewStyle" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:textcolor = "@android:color/white" > |
5 |
</ textview ></ linearlayout > |
word_item.xml,程式碼如下:
[程式碼]xml程式碼:
1 |
<!--?xml
version="1.0" encoding="utf-8"?--> |