Android中Adapter的種類與特點
概念:
Adapter是連線後端資料和前端顯示的介面卡介面,是資料和UI(View)之間一個重要的紐帶。在常見的View(ListView,GridView)等地方都需要用到Adapter。如下圖直觀的表達了Data、Adapter、View三者的關係:
Android中與Adapter有關的所有介面、類的完整層級圖。在我們使用過程中可以根據自己的需求實現介面或者繼承類進行一定的擴充套件。比較常用的有 BaseAdapter,SimpleAdapter,ArrayAdapter,SimpleCursorAdapter等。
dapter就是介面卡的意思。在GOF設計模式中存在的一種設計模式,就是介面卡的意思。
Android中常用的Adapter有:
BaseAdapter:基礎介面卡,Android BaseAdapter實現了ListAdapter和SpinnerAdapter的介面,GridView的介面卡有實現了ListAdapter,所以,BaseAdapter對於Spinner、ListView、GridView是通用的。BaseAdapter是一個抽象類,繼承它的類要實現很多方法。
ArrayAdapter:ArrayAdapter是BaseAdapter的之類,從BaseAdapter派生C胡來,它有BaseAdapter的所以功能。但是,ArrayAdapter可以直接使用泛型結構。
ArrayAdapter比較簡單,只能顯示一行文字。
SimpleAdapter:簡單介面卡,可以將靜態資料對映到XML檔案定義好的佈局中。利用SimpleAdapter可以顯示比較複雜的列表,比如,每行顯示一些圖片、文字啊等一些複雜/特殊效果,但它只是單純的顯示,若在後期對列表進行修改,則不可以。SimpleAdapter具有最後的擴充性。
SimpleCursorAdapter:SimpleCursorAdapter是一個專門用於將資料庫表中資料顯示在UI元件中。在Android中一些普通的Adapter物件也可以將資料庫中的資料顯示阿紫介面上,但用普通的Adapter工作量要大很多。
1、BaseAdapter是一個抽象類,繼承它需要實現較多的方法,所以也就具有較高的靈活性;
2、ArrayAdapter支援泛型操作,最為簡單,只能展示一行字。
3、SimpleAdapter有最好的擴充性,可以自定義出各種效果。
4、SimpleCursorAdapter可以適用於簡單的純文字型ListView,它需要Cursor的欄位和UI的id對應起來。如需要實現更復雜的UI也可以重寫其他方法。可以認為是SimpleAdapter對資料庫的簡單結合,可以方便地把資料庫的內容以列表的形式展示出來。
ArrayAdapter和BaseAdapter的區別
ArrayAdapter是從BaseAdapter派生出來的,具備BaseAdapter的所有功能,但ArrayAdapter更為 強大,它例項化時可以直接使用泛型構造,我們在Android SDK中可以看到android.widget.ArrayAdapter的字樣,當然也可以使用ArrayAdapter(Context context, int textViewResourceId) 第二個引數直接繫結一個layout當數量較多,比如超過 100條或頻繁動態增減時使用arrayadapter可以方便控制ui,通過setNotifyOnChanage方法,如果比較簡單僅僅呈現直接從 baseadapter更節省資源
ArrayAdapter<T>:適合非常簡單的資料顯示,很方便,很簡單。
SimpleAdapter:可以自定義Item佈局,用於顯示交簡單的佈局及控制元件,但佈局內的控制元件如按鈕等無法獲取到焦點,當然也就無法獲取到他們的點選事件。
SimpleCursorAdapter與SimpleAdapter相似,只是他的資料來源是Cursor型別而已。
BaseAdpter子類:最常用的ListView資料介面卡,通過繼承BaseAdpter可以較靈活的實現資料的繫結,同時通過使用ViewHolder等可以很好的提高ListView的繪製效率。另一個很重要的原因,BaseAdpter類介面卡繫結的Item佈局中的子控制元件可以獲取到觸控焦點,也就是說,通過這種方式,我們可以獲取Item佈局中一些物件的點選,長按,check等方法。
應用場景:
ArrayAdapter
列表的顯示需要三個元素:
a.ListVeiw 用來展示列表的View。
b.介面卡 用來把資料對映到ListView上的中介。
c.資料 具體的將被對映的字串,圖片,或者基本元件。
String[] strs = {"1","2","3","4","5"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
setListAdapter(adapter);
simpleAdapter的擴充套件性最好,可以定義各種各樣的佈局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(複選框)等等。下面的程式碼都直接繼承了ListActivity,ListActivity和普通的Activity沒有太大的差別,不同就是對顯示ListView做了許多優化,方面顯示而已。
SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[] { "title", "img" }, new int[] { R.id.title, R.id.img });
setListAdapter(adapter);
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "摩托羅拉");
map.put("img", R.drawable.icon);
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "諾基亞");
map.put("img", R.drawable.icon);
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "三星");
map.put("img", R.drawable.icon);
list.add(map);
return list;
使用simpleAdapter的資料用一般都是HashMap構成的List,list的每一節對應ListView的每一行。HashMap的每個鍵值資料對映到佈局檔案中對應id的元件上。因為系統沒有對應的佈局檔案可用,我們可以自己定義一個佈局vlist.xml。下面做適配,new一個SimpleAdapter引數一次是:this,佈局檔案(vlist.xml),HashMap的 title 和 info,img。佈局檔案的元件id,title,info,img。佈局檔案的各元件分別對映到HashMap的各元素上,完成適配。
SimpleCursorAdapter
//獲得一個指向系統通訊錄資料庫的Cursor物件獲得資料來源
Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
startManagingCursor(cur);
//例項化列表介面卡
ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});
setListAdapter(adapter);
一定要以資料庫作為資料來源的時候,才能使用SimpleCursorAdapter,這裡特別需要注意的一點是:不要忘了在AndroidManifest.xml檔案中加入許可權
BaseAdapter
有時候,列表不光會用來做顯示用,我們同樣可以在在上面新增按鈕。新增按鈕首先要寫一個有按鈕的xml檔案,然後自然會想到用上面的方法定義一個介面卡,然後將資料對映到佈局檔案上。但是事實並非這樣,因為按鈕是無法對映的,即使你成功的用佈局檔案顯示出了按鈕也無法新增按鈕的響應,這時就要研究一下ListView是如何現實的了,而且必須要重寫一個類繼承BaseAdapter。