深入理解Adapter 一、ListView ListView是Android開發過程中較為常見的組件之一,它將數據以列表的形式展現出來。一般而言,一個ListView由以下三個元素組成:
1.View:展示列表視圖,通常是一個xml所指定的。大家都知道Android的界面基本上是由xml文件負責完成的,所以ListView的界面也理所應當的使用了xml定義。例如在ListView中經常用到的“android.R.layout.simple_list_item_1”等, 就是Android系統內部定義好的一個xml文件。
2.Adapter適配器:用於將不同的數據映射到View上。不同的數據對應不同的適配器,如ArrayAdapter,CursorAdapter, SimpleAdapter等, 他們能夠將數組,指針指向的數據,Map等數據或基本組件映射到View上。也正是由於適配器的存在,使得ListView的使用相當靈活,經過適配器的處理後,在 view看來所有的數據映射過來都是一樣的。 3.數據:具體的數據和資源。可以是字符串圖片、Map映射等,通過適配器這些數據將會被現實到 ListView上。 總之,所有的數據和資源要顯示到ListView上都通過適配器來完成。ArrayAdapter,CursorAdapter, SimpleAdapter為系統已有的適配器,可以將如數組、Cursor指向的數據(一般為數據庫)、Map裡的數據。
二、深入理解Adapter 1.概要:Adapter是連接後端數據和前端視圖顯示的適配器接口,是數據和UI(View)之間的橋梁。通過適配器,可以將不同的數據映射並顯示到View上。在常見的View(ListView、GridView)等地方都需要用到Adapter。對於Data、Adapter、View的關系,如下圖所示:
2.Android中Adapter類 (1)BaseAdapter適配器:為一個抽象類,使用該類可以實現更為復雜的ListView。通過文檔可以看出,ArrayAdapter,CursorAdapter, SimpleAdapter都繼承於BaseAdapter。所以通過繼承BaseAdapter就可以完成自己的Adapter,可以將任何復雜組合的數據和資源,以任何你想要的顯示效果展示處理。繼承BaseAdapter之後,需要重寫以下四個方法:getCount,getItem,getItemId,getView。但是,ArrayAdapter,CursorAdapter, SimpleAdapter則無須要全部重寫上述四種方法。
(2)ArrayAdapter適配器:支持泛型操作,最為簡單,只能展示一行字符串。
(3)SimpleAdapter適配器:有最好的擴充性,可以自定義出各種效果(字符串、圖片、Map集),通常使用xml布局文件來指定視圖。
(4)SimpleCursorAdapter適配器:可以適用於簡單的純文字型ListView,它需要Cursor的字段和UI的id對應起來。如需要實現更復雜的UI也可以重寫其他方法。可以認為是SimpleAdapter對數據庫的簡單結合,可以方便地把數據庫的內容以列表的形式展示出來。
3.ListView加載adapter一般過程 (1)先判斷adapter有多少數據項,根據這個數據確定有多少item(列表項). -----getCount()方法實現 (2)確定每個item裡加載哪個View. -----getView()方法實現 (3)向對應的View中加載需要顯示的數據
4.ArrayAdapter實例分析 (1)開發基本思路 ArrayAdapter適配器支持泛型操作,列表的每一項只能顯示一串字符,不能顯示圖片等資源數據。 *使用字符串數組作為數據源 a.實現一個字符串數組作為數據源(List集)(數組元素有幾個,就有幾個列表項) b.實例化一個ArrayAdapter
適配器對象,用於裝配數據源到指定的View. ArrayAdapter adapter=new ArrayAdapter( this,android.R.layout.simple_expandable_list_item_1, strs); c.將ArrayAdapter適用於ListActivity的ListView setListAdapter(adapter);
*使用List集合(ArrayList)作為數據源 a.實例化一個ListView對象 b.實例化一個ArrayAdapter對象(集合中數據項類型為String),將Map集合中的數據項映射到列表項中; ArrayAdapter adapter=new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1,getData()); c.裝配Adapter到ListView中並顯示ListView視圖 listview.setAdapter(adapter); //裝配Adapter到ListView setContentView(listview); //將list視圖顯示 (2)源代碼分析一 MainActivt.java package com.example.android_arraylist_1; mport android.app.ListActivity; import android.os.Bundle; import android.widget.ArrayAdapter; public class MainActivity extends ListActivity { public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); String[] strs={第一項,第二項,第三項,第四項}; //列表項數據 ArrayAdapter adapter=new ArrayAdapter( //實例化一個ArrayAdapter適配器來裝配數據 this, //上下文 android.R.layout.simple_expandable_list_item_1, //列表的每一行布局,只顯示一行文字 strs); //數據源(一個List集合) setListAdapter(adapter); //將List集合數據顯示在List視圖中 } } 分析: 上面代碼使用了ArrayAdapter(Context context, int textViewResourceId, List objects)來裝配數據,要裝配這些數據就需要一個連接ListView視圖對象和數組數據的適配器來兩者的適配工作,ArrayAdapter的構造需要三個參數,依次為this,布局文件(注意這裡的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系統定義好的布局文件只顯示一行文字,數據源(一個List集合)。同時用setAdapter()完成適配的最後工作。 效果: (3)源碼分析二 ArrayListActivity.java
package com.example.android_arraylist_2; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.widget.ArrayAdapter; import android.widget.ListView; public class ArrayListActivity extends Activity { private ListView listview; //定義一個ListView對象 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listview =new ListView(this); //實例化一個ListView對象 ArrayAdapter adapter=new ArrayAdapter(this, //實例化一個適配器adapter android.R.layout.simple_expandable_list_item_1, //布局文件:顯示一行文字 getData()); //獲取數據源(ArrayList集合) listview.setAdapter(adapter); //裝配Adapter到ListView setContentView(listview); //將list視圖顯示 } private List getData() { // TODO Auto-generated method stub List data=new ArrayList(); //實例化一個ArrayList集合,用於裝載數據 data.add(測試數據1); //向ArrayList集合中添加元素數據 data.add(測試數據2); data.add(測試數據3); data.add(測試數據4); return data; //返回ArrayList集合對象 } } 分析: (1) getData() (2) List (3) List data=new ArrayList() 效果:
5.SimpleAdapter實例分析 與ArrayAdapter不同的是,simpleAdapter的擴展性最好,可以定義各種各樣的布局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復選框)等等。一般情況下,我們都是利用Map哈希表作為數據源,通過鍵到組件Id的映射實現列表項內容。 (1)開發基本思路 a.裝配適配器,將Map鍵數據資源映射到Id所對應的組件上; SimpleAdapter adapter =new SimpleAdapter(this, //上下文 getData(), //獲取list數據集 R.layout.simple, //指定布局文件 new String[]{img,title1,info}, //Map集合鍵 new int[]{R.id.img,R.id.title1,R.id.info});//界面組件Id b.實現一個Map集合,並將map對象添加ArrayList中 List