Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android筆記十一.ListView+Adapter

Android筆記十一.ListView+Adapter

編輯:關於Android編程

深入理解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> list=new ArrayList>(); //實例化一個ArrayList對象, Map map=new HashMap(); //設置列表第一項標題與圖標(使用Map) c.將ArrayAdapter適用於ListActivity的ListView setListAdapter(adapter);
(2)源代碼分析 SimpleAdapterActivity.java
package com.example.android_sampleadapter_1; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.ListActivity; import android.os.Bundle; import android.widget.SimpleAdapter; public class SimpleAdapterActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //1.裝配適配器,並綁定數據到相應的視圖 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 //2.顯示視圖 setListAdapter(adapter); } //3.Map數據集:HashMap構成的List,list的每一節對應ListView的每一行 //HashMap的每個鍵值數據映射到布局文件中對應id的組件上 private List> getData() { // TODO Auto-generated method stub List> list=new ArrayList>(); //實例化一個ArrayList對象, Map map=new HashMap(); //設置列表第一項標題與圖標(使用Map) map.put(img, R.drawable.a); map.put(title1, 華為榮耀); map.put(info, 學人家玩搶購,真TM坑爹!); list.add(map); //將一個map對象添加到列表中 map=new HashMap(); map.put(img, R.drawable.b); map.put(title1, 中國移動); map.put(info, god knows); list.add(map); //將一個map對象添加到列表中 map=new HashMap(); map.put(img, R.drawable.c); map.put(title1, 中興); map.put(info, 手機還不錯,只是要死不活的); list.add(map); //將一個map對象添加到列表中 map=new HashMap(); map.put(img, R.drawable.d); map.put(title1, 魅族4); map.put(info, 有點貴!); list.add(map); //將一個map對象添加到列表中 return list; } } 分析:
使用simpleAdapter的數據用一般都是HashMap構成的List,list的每一節對應ListView的每一行。HashMap的每個鍵值數據映射到布局文件中對應id的組件上。因為系統沒有對應的布局文件可用,我們可以自己定義一個布局simple.xml。下面做適配,new一個SimpleAdapter參數一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img,布局文件的組件id,title,info,img。布局文件的各組件分別映射到HashMap的各元素上,完成適配。 simple.xml-列表項布局文件 xmlns:tools=http://schemas.android.com/tools
android:orientation=horizontal
android:layout_width=match_parent
android:layout_height=match_parent >

android:id=@+id/img
android:layout_width=wrap_content
android:layout_height=wrap_content
android:layout_margin=10dp/>

android:id=@+id/title1
android:layout_width=wrap_content
android:layout_height=wrap_content
android:textColor=#FF000000 android:textSize=22sp/>
android:id=@+id/info
android:layout_width=wrap_content
android:layout_height=wrap_content
android:textColor=#FF000000 android:textSize=13sp/>



\
6.SimpleAdapter實例分析
package com.example.android_simplecuroradapter; import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; import android.provider.Contacts.People; import android.support.v4.widget.SimpleCursorAdapter; import android.widget.ListAdapter; public class SimpleCursorActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //1.獲得一個指向系統通訊錄數據庫的CurSor對象獲得數據來源 Cursor cur=getContentResolver().query(People.CONTENT_URI, null, null, null, null); startManagingCursor(cur); //2.實例化列表適配器 ListAdapter adapter=new SimpleCursorAdapter(this,android.R.layout.simple_expandable_list_item_1,cur,new String[] {People.NAME},new int[] {android.R.id.text1}); //3.顯示視圖 setListAdapter(adapter); } } 分析: 一定要以數據庫作為數據源的時候,才能使用SimpleCursorAdapter,這裡特別需要注意的一點是:不要忘了在AndroidManifest.xml文件中加入權限 效果: \




  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved