Adapter介紹
Android是完全遵循MVC模式設計的框架,Activity是Controller,layout是View
因爲layout五花八門,很多數據都不能直接綁定上去,所以Android引入了Adapter這個機制作爲複雜數據的展示的轉換載體,所以各種Adapter只不過是轉換的方式和能力不一樣而已。
幾種常用的Adapter:
其中BaseAdapter的直接子類:
ArrayAdapter<T>, CursorAdapter, SimpleAdapter
BaseAdapter的間接子類:
ResourceCursorAdapter, SimpleCursorAdapter
Adapter是將數據綁定到UI界面上的橋接類。Adapter負責創建顯示每個項目的子View和提供對下層數據的訪問。
在多數情況下,你不需要創建自己的Adapter。Android提供了一系列Adapter來將數據綁定到UI Widget上。
因爲Android負責提供數據和選擇用於顯示每個項目的View,所以Adapter能快速地修改要綁定的控件的外觀和功能。
下面的列表顯示了兩個最有用和最通用的本地Adapter:
❑ ArrayAdapter
ArrayAdapter是一個綁定View到一組對象的通用類。默認情況下,ArrayAdapter綁定每個對象的toString值到在layout中預先定義的TextView控件上。可變通的,構造函數允許你使用更加複雜的layout或者通過重寫getView方法來擴展類從而使用TextView的替代物(如ImageView或嵌套的layout)。
❑ SimpleCursorAdapter
SimpleCursorAdapter綁定View到Content Provider查詢返回的遊標上。指定一個XML layout定義,然後將數據集中的每一列的值綁定到layout中的一個View上。
使用Adapter進行數據綁定:
將Adapter應用到繼承自AdapterView類上,你需要調用View的setAdapter方法,傳入一個Adapter實例,如下面的片段所示:
- ArrayList<String> myStringArray = new ArrayList<String>();
- ArrayAdapter<String> myAdapterInstance;
- int layoutID = android.R.layout.simple_list_item_1;
- myAdapterInstance = new ArrayAdapter<String>(this, layoutID, myStringArray);
- myListView.setAdapter(myAdapterInstance);
這個片段顯示了最簡單的情況,將數組中的字符串綁定到ListView中用於顯示每個項目的簡單TextView控件上。
Adapter中的體系結構:
在android開發中列表的使用是十分常見的。google對列表的封裝使列表既有顯示傳統文本列表的能力,也有加入了諸如選擇項、複選項等處理事件的能力。
在android的api中,LIST和adapter都被放在了android.widget包內。包內的具體結構我這裏先不展示了,主要側重列表和adapter。adapter的作用就是將要在列表內顯示的數據和列表本身結合起來。列表本身只完成顯示的作用,其實他就是繼承自VIEWGROUP類。但是他又有一個獨特的函數就是setAdapter()就是完成了view和adapter的結合。adapter如同其本身含義,其實就是一個適配器,他可以對要顯示的數據進行統一的封裝,主要是將數據變成view提供給list。
我們先來看看adapter的體系:
public interface Adapter----0層(表示繼承體系中的層次)
public interface ExpandableListAdapter---(無所謂層次因爲沒有其他接口繼承實現它)
這是adapter的始祖,其他個性化的adapter均實現它並加入自己的接口。
public interface ListAdapter----1層
public interface SpinnerAdapter----1層
public interface WrapperListAdapter----2層(實現ListAdapter)
以上接口層面上的體系已經完了。可以看出來作爲widget view的橋樑adapter其實只分爲2種:ListAdapter和SpinnerAdapter以及ExpandableListAdapter。也就是說所有widget也就是基於list和spinne與ExpandableList三種view形式的。
由於在實際使用時,我們需要將數據加入到Adapter,而以接口形式呈現的adapter無法保存數據,於是Adapter就轉型爲類的模式。
public abstract class BaseAdapter----2層(實現了ListAdapter和SpinnerAdapter)
以抽象類的形式出現構造了類型態下的頂層抽象,包容了List和Spinner
public class ArrayAdapter----3層
public class SimpleAdapter---3層
public class CursorAdapter----3層(CursorAdapter其後還有子類這裏先不探討)
基本體系有了之後,讓我們看看頂層Adapter裏有哪些方法(只列舉常用的):
abstract Object getItem(int position)
abstract int getCount()
abstract long getItemId(int position)
abstract int getItemViewType(int position)
abstract View getView(int position,View convertVeiw,ViewGroup parent)
以上是比較重要的方法,ArrayAdapter他們也是重新實現以上方法的。在實際的開發過程中,往往我們要自己做屬於自己的Adapter,以上方法都是需要重新實現的。