Android中Adapter的種類與特點(diǎn)

概念:

Adapter是連接后端數(shù)據(jù)和前端顯示的適配器接口,是數(shù)據(jù)和UI(View)之間一個(gè)重要的紐帶。在常見的View(ListView,GridView)等地方都需要用到Adapter。如下圖直觀的表達(dá)了Data、Adapter、View三者的關(guān)系:

Android中與Adapter有關(guān)的所有接口、類的完整層級(jí)圖。在我們使用過(guò)程中可以根據(jù)自己的需求實(shí)現(xiàn)接口或者繼承類進(jìn)行一定的擴(kuò)展。比較常用的有BaseAdapter,SimpleAdapter,ArrayAdapter,SimpleCursorAdapter等。

dapter就是適配器的意思。在GOF設(shè)計(jì)模式中存在的一種設(shè)計(jì)模式,就是適配器的意思。

Android中常用的Adapter有:

BaseAdapter:基礎(chǔ)適配器,Android BaseAdapter實(shí)現(xiàn)了ListAdapter和SpinnerAdapter的接口,GridView的適配器有實(shí)現(xiàn)了ListAdapter,所以,BaseAdapter對(duì)于Spinner、ListView、GridView是通用的。BaseAdapter是一個(gè)抽象類,繼承它的類要實(shí)現(xiàn)很多方法。

ArrayAdapter:ArrayAdapter是BaseAdapter的之類,從BaseAdapter派生C胡來(lái),它有BaseAdapter的所以功能。但是,ArrayAdapter可以直接使用泛型結(jié)構(gòu)。

ArrayAdapter比較簡(jiǎn)單,只能顯示一行文本。

SimpleAdapter:簡(jiǎn)單適配器,可以將靜態(tài)數(shù)據(jù)映射到XML文件定義好的布局中。利用SimpleAdapter可以顯示比較復(fù)雜的列表,比如,每行顯示一些圖片、文本啊等一些復(fù)雜/特殊效果,但它只是單純的顯示,若在后期對(duì)列表進(jìn)行修改,則不可以。SimpleAdapter具有最后的擴(kuò)充性。

SimpleCursorAdapter:SimpleCursorAdapter是一個(gè)專門用于將數(shù)據(jù)庫(kù)表中數(shù)據(jù)顯示在UI組件中。在Android中一些普通的Adapter對(duì)象也可以將數(shù)據(jù)庫(kù)中的數(shù)據(jù)顯示阿紫界面上,但用普通的Adapter工作量要大很多。SimpleCursorAdapter使用上非常相似,可把SimpleAdapter理解為對(duì)數(shù)據(jù)庫(kù)的一種簡(jiǎn)單結(jié)合,然后 分別把數(shù)據(jù)庫(kù)中的內(nèi)容以列表的形式展示出來(lái)。

1、BaseAdapter是一個(gè)抽象類,繼承它需要實(shí)現(xiàn)較多的方法,所以也就具有較高的靈活性;

2、ArrayAdapter支持泛型操作,最為簡(jiǎn)單,只能展示一行字。

3、SimpleAdapter有最好的擴(kuò)充性,可以自定義出各種效果。

4、SimpleCursorAdapter可以適用于簡(jiǎn)單的純文字型ListView,它需要Cursor的字段和UI的id對(duì)應(yīng)起來(lái)。如需要實(shí)現(xiàn)更復(fù)雜的UI也可以重寫其他方法。可以認(rèn)為是SimpleAdapter對(duì)數(shù)據(jù)庫(kù)的簡(jiǎn)單結(jié)合,可以方便地把數(shù)據(jù)庫(kù)的內(nèi)容以列表的形式展示出來(lái)。

ArrayAdapter和BaseAdapter的區(qū)別

ArrayAdapter是從BaseAdapter派生出來(lái)的,具備BaseAdapter的所有功能,但ArrayAdapter更為 強(qiáng)大,它實(shí)例化時(shí)可以直接使用泛型構(gòu)造,我們?cè)贏ndroid SDK中可以看到android.widget.ArrayAdapter的字樣,當(dāng)然也可以使用ArrayAdapter(Context context, int textViewResourceId)第二個(gè)參數(shù)直接綁定一個(gè)layout當(dāng)數(shù)量較多,比如超過(guò)100條或頻繁動(dòng)態(tài)增減時(shí)使用arrayadapter可以方便控制ui,通過(guò)setNotifyOnChanage方法,如果比較簡(jiǎn)單僅僅呈現(xiàn)直接從baseadapter更節(jié)省資源

ArrayAdapter:適合非常簡(jiǎn)單的數(shù)據(jù)顯示,很方便,很簡(jiǎn)單。

SimpleAdapter:可以自定義Item布局,用于顯示交簡(jiǎn)單的布局及控件,但布局內(nèi)的控件如按鈕等無(wú)法獲取到焦點(diǎn),當(dāng)然也就無(wú)法獲取到他們的點(diǎn)擊事件。

SimpleCursorAdapter與SimpleAdapter相似,只是他的數(shù)據(jù)源是Cursor類型而已。

BaseAdpter子類:最常用的ListView數(shù)據(jù)適配器,通過(guò)繼承BaseAdpter可以較靈活的實(shí)現(xiàn)數(shù)據(jù)的綁定,同時(shí)通過(guò)使用ViewHolder等可以很好的提高ListView的繪制效率。另一個(gè)很重要的原因,BaseAdpter類適配器綁定的Item布局中的子控件可以獲取到觸摸焦點(diǎn),也就是說(shuō),通過(guò)這種方式,我們可以獲取Item布局中一些對(duì)象的點(diǎn)擊,長(zhǎng)按,check等方法。

應(yīng)用場(chǎng)景:

ArrayAdapter

列表的顯示需要三個(gè)元素:

a.ListVeiw用來(lái)展示列表的View。

b.適配器 用來(lái)把數(shù)據(jù)映射到ListView上的中介。

c.?dāng)?shù)據(jù) ???具體的將被映射的字符串,圖片,或者基本組件。

String[] strs = {"1","2","3","4","5"};

ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1,strs);

setListAdapter(adapter);

simpleAdapter的擴(kuò)展性最好,可以定義各種各樣的布局出來(lái),可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復(fù)選框)等等。下面的代碼都直接繼承了ListActivity,ListActivity和普通的Activity沒(méi)有太大的差別,不同就是對(duì)顯示ListView做了許多優(yōu)化,方面顯示而已。

SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[] { "title", ?"img" }, new int[] { R.id.title, R.id.img });

setListAdapter(adapter);

List> list = new ArrayList>();

Map map = new HashMap();

map.put("title", "摩托羅拉");

map.put("img", R.drawable.icon);

list.add(map);

map = new HashMap();

map.put("title", "諾基亞");

map.put("img", R.drawable.icon);

list.add(map);

map = new HashMap();

map.put("title", "三星");

map.put("img", R.drawable.icon);

list.add(map);

return list;

使用simpleAdapter的數(shù)據(jù)用一般都是HashMap構(gòu)成的List,list的每一節(jié)對(duì)應(yīng)ListView的每一行。HashMap的每個(gè)鍵值數(shù)據(jù)映射到布局文件中對(duì)應(yīng)id的組件上。因?yàn)橄到y(tǒng)沒(méi)有對(duì)應(yīng)的布局文件可用,我們可以自己定義一個(gè)布局vlist.xml。下面做適配,new一個(gè)SimpleAdapter參數(shù)一次是:this,布局文件(vlist.xml),HashMap的title和info,img。布局文件的組件id,title,info,img。布局文件的各組件分別映射到HashMap的各元素上,完成適配。

SimpleCursorAdapter

//獲得一個(gè)指向系統(tǒng)通訊錄數(shù)據(jù)庫(kù)的Cursor對(duì)象獲得數(shù)據(jù)來(lái)源

Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);

startManagingCursor(cur);

//實(shí)例化列表適配器

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);

一定要以數(shù)據(jù)庫(kù)作為數(shù)據(jù)源的時(shí)候,才能使用SimpleCursorAdapter,這里特別需要注意的一點(diǎn)是:不要忘了在AndroidManifest.xml文件中加入權(quán)限

BaseAdapter

有時(shí)候,列表不光會(huì)用來(lái)做顯示用,我們同樣可以在在上面添加按鈕。添加按鈕首先要寫一個(gè)有按鈕的xml文件,然后自然會(huì)想到用上面的方法定義一個(gè)適配器,然后將數(shù)據(jù)映射到布局文件上。但是事實(shí)并非這樣,因?yàn)榘粹o是無(wú)法映射的,即使你成功的用布局文件顯示出了按鈕也無(wú)法添加按鈕的響應(yīng),這時(shí)就要研究一下ListView是如何現(xiàn)實(shí)的了,而且必須要重寫一個(gè)類繼承BaseAdapter。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容