android ListView及ArrayAdapter,SimpleCursorAdapter,SimpleAdapter用法示例
文章分類:移動開發
選自: 1 : http://www.cnblogs.com/wservices/archive/2010/06/17/1759793.html
2 :[原創技術] 連載(12 ):SimpleCursorAdapter 類與數據綁定
3 : http://blog.sina.com.cn/s/blog_6213b4e50100lk9i.html
佈局
LiveActivity 本身繼承了關於 List 操作的衆多接口,我們可以方便的重寫這些操作中需要的方法來實現自己需要的功能。
如果要用 ListActivity ,則 Activity 的 Layout 文件中必須包括一個(只能一個) ListView ,且 ListView id="@id/android:list" 。
如下代碼,一個標準的 ListActivity Layout 文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="8dp"
android:paddingRight="8dp">
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#00FF00"
android:layout_weight="1"
android:drawSelectorOnTop="false"/>
<TextView id="@id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FF0000"
android:text="No data"/>
</LinearLayout>
請注意 ListView 與 TextView 的 id 。前面說了, ListView 的 Id 爲固定不變的,爲” @./idandroid:ost ”, ListActivity 會根據 id 自動查找 ListView 引用;但如果當 ListView 中沒有值而又想提示一句話時,那麼用於指定顯示提示信息的 TextView 的 id 必須爲” "@id/android:empty" ,提示的信息可以通過 android:text 進行指定。
綁定
OK ,關於如何佈局說完了,那麼如何給 List 綁定值,並進行操作呢?
首先我們需要確實的是, ListView 的佈局也完成了,並通過調用 setContentView( … ) 進行了綁定,但直到現在我們還沒有確定 ListView 中的第一行顯示的格式是什麼,是直接顯示文字還是要“圖文並茂”的顯示。
Android 系統爲我們提供了多種模板進行選擇 (android.R.layout) ,如
Simple_list_item_1 每項有一個 TextView
Simple_list_item_2 每項有兩個 TextView
Simple_list_item_checked 帶 CheckView 的項
Simple_list_item_multiple_choise 每項有一個 TextView 並可以多選
Simple_list_item_single_choice 每項有一個 TextView ,但只能進行單選。
但然,如果以上項模板還無法滿足你的要求,那隻能自定義模板了(相當簡單,就是定義一個 layout 佈局)。如果你做的 asp.net 的開發的話,是否對 dataList 控件有印象呢。如果對 DataList 有印象,那麼理解 ListView 也就相當的簡單了。
自定義模板可以根據自己的需要定義成任意的格式,包括圖片、方案及其他可顯示的 View ,不用多說,自己定義就好了,關鍵是如果使用並進行模板的綁定。
如何要對 ListView 進行數據綁定,必須使用到一個接口: Adapter 。
其中最經常與 ListView 進行配合使用的有 ArrayAdapter 、 CursorAdapter 及 SimpleAdapter 等。
從名稱可以看出 ArrayAdapter 使用的是一個 ArrayAdapter 做爲數據源, SimpleCursorAdapter 使用的是一個 Cursor 使用數據源,都比較容易理解,那麼如何使用 SimpleAdapter 作爲數據的適配器呢。 Ok ,從易到難。
ArrayAdapter:
ListView listView;
String[] data = { "Item1", "Item2",
"Item3", "Item4", "Item5" };
listView=(ListView)findViewById(R.id.lv);
listView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_single_choice, data));
SimpleCursorAdapter:
SimpleCursorAdapter 類構造方法的定義。
public SimpleCursorAdapter(Context context, intlayout, Cursor c, String[] from, int[] to)
在本節的例子中會通過 SimpleCursorAdapter 類將一個數據表綁定在 ListView 上,也就是說,該 ListView 會顯示數據表的全部記錄。在綁定數據之前,需要先編寫一個 SQLiteOpenHelper 類的子類,用於操作數據庫
見附件:
public class DBService extends SQLiteOpenHelper{}
由於本例不需要對 test.db 進行升級,因此,只有在 DBServie 類的 onCreate 方法中有創建數據表的代碼。 DBService 類創建了一個 test.db 數據庫文件,並在該文件中創建了 t_test 表。在該表中包含了兩個字段: _id 和 name 。其中 _id 是自增字段,並且是主索引。
下面來編寫 Main 類。在該類的 onCreate 方法中創建了 DBService 對象,然後通過 DBService 類的 query 方法查詢出 t_test 表中的所有記錄,並返回 Cursor 對象。見附件
public class Main extends Activity{}
SimpleCursorAdapter 類構造方法的第 4 個參數表示返回的 Cursor 對象中的字段名,而第 5 個參數表示要將該字段的值賦給哪個組件。該組件在第 2 個參數指定的佈局文件中定義。
注意:在綁定數據時, Cursor 對象返回的記錄集中必須包含一個叫“ _id ”的字段,否則將無法完成數據綁定。也就是說 SQL 語句不能是 select name from t_contacts 。如果在數據表中沒有“ _id ”字段,可以採用其他的方法來處理。詳細處理方法見本章的實例 39 。
小知識:數據庫文件存到哪了?
光看到本節的例子建立了 SQLite 數據庫文件,那麼數據庫文件被放到哪個目錄了呢。如果使用 SQLiteOpenHelper 類的 getReadableDatabase 或 getWritableDatabase 方法獲得 SQLiteDatabase 對象,那麼系統會在手機內存的 /data/data/<packagename>/databases 目錄中創建數據庫文件。當然,使用這兩個方法也只能打開這個目錄中的數據庫文件。
SimpleAdapter:
simpleAdapter 的構造函數 如下:
SimpleAdapter(Context context, List <? extends Map <String, ?>> data, int resource, String[] from, int[] to)
一個 SimlpleAdapter 是這個工作的。假設將 SimpleAdapter 用於 ListView 。那麼 ListView 的每一個列表項就是 resource 參數值指定的佈局。而 data 參數就是要加載到 ListView 中的數據。我們先看每一個列表項,假設列表項所對應的佈局文件中包含了兩個組件: TextView 和 EditText , id 分別爲 textview 和 edittext 。那麼在加載列表項時,需要通過組件的 id 和 data 參數中 List 元素中的 Map 對象對應。因此, from 參數 Map 對象的 key ,而 to 表示組件的 id ,例如,本例中的參數值爲 from = new String[]{"textview", "edittext"} , to = new int[]{R.id.textview , R.id.edittext} 。意思就是將 Map 對象中 key 爲 textview 的 value 綁定到 R.id.textview 上, edittext 也類似。
現在來看 data 參數,一個 ListView 由多個列表項組成。每一個列表項由一個 Map 對象提供數據,而多個列表項則由 List 對象提供多個 Map 對象。 OK ,就是這麼簡單,只要瞭解了它們的工作原理,一切就可以搞定。如果還不太明白,自己做個例子吧。 good luck !
這是我做的一個小例子,你如果有什麼不明白可以做一下,就知道了。
見附件 simpleAdapter.xml 文件 ,TestSimpleAdapter