ListView是在Android很常見的一種視圖,ListView不論在電話簿中還是觀看大量的列表資料,都是會用得到。
ListView的使用需要搭配Adapter,Adapter是用來連接資料和ListView的,Adapter除了會用到ListView中,另外會用到還有Spinner(類似下拉選單)的這個元件中。在Google IO 2009的其中一張投影片中,可以很清楚的看到其中的關係圖:
從這張圖就可以看到Adapter基本上會分成Cursor類和ArrayList類的。Cursor和資料庫或目前電話中的資料有關,例如要抓出目前電話簿中的聯絡人資料,用的就是Cursor的Adapter,而自己在程式中建立的陣列資料,用的就會是ArrayList類的Adapter。
最常用的有幾種Adapter:
- ArrayAdapter:將一組數組連繫到ListView
- SimpleAdapter:適用於自訂ListView外觀的應用場合
- BaseAdapter:抽象類別,所以有多個方法需要實作。適用於需要自訂ListView外觀等靈活應用的場合。
- SimpleCursorAdapter:將一組現有的資料庫或聯絡人等ContentProvider的資料查詢的結果連繫到ListView中
首先,要使用ListView可以用ListView這個UI組件,放置到目前的Activity中。另一個可以用的方式,是直接繼承ListActivity,這是一個Activity的子類,其中就會包含一個全螢幕的ListView物件。ListActivity用法比較簡單:
1 | public class ListDemo1 extends ListActivity { |
第10行:用setListAdapter方法設定一個ArrayAdapter
第14行:按鍵過濾功能,因為List中的項目有可能很多,像這個範例你按下鍵盤中的a,就會出現以a開頭的項目,方便找到項目
第18~25行:一些要放到List中的字串值
假設是在Activity中除了ListView之外,還要放入其他的組件時,這時候就需要在Activity中加入一個ListView組件,利用這個組件的setAdapter來連接Adapter,範例如下:
1 | public class ListDemo2 extends Activity { |
值得一提的是在ArrayAdapter中有一個android定義好的內建list樣式 - "android.R.layout.simple_list_item_1",注意這並不是我們定義的,在android系統中預設就有存在了。其中常用的的這些樣式如下所列:
- android.R.layout.simple_list_item_1:一行text
- android.R.layout.simple_list_item_2:一行text較大,一行text較小
- android.R.layout.simple_list_item_single_choice:單選
- android.R.layout.simple_list_item_multiple_choice:多選按鈕
- android.R.layout.simple_list_item_checked:勾選盒
第1個剛剛有用了,事實上第3,4,5個也是直接換上去就可以看到了,只不過還沒有實作選中後的處理方法。
第2個android.R.layout.simple_list_item_2就比較麻煩了,原因是ArrayAdapter並不支援傳入兩個字串參數值,所以要改用SimpleAdapter,而且傳入的數值型態要改為ArrayList才可以,下面的範例:
1 | public class ListDemo3 extends ListActivity { |
如果不要用android內附的simple_list_item_2,改用自己定義的樣式,要怎麼作呢?像上面的範例,再加上一個評分的字串在地點的旁邊。首先先製作一個給List的項目用的layout,如下的xml,取名為mylistview1.xml。
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | //把資料加入ArrayList中 |
執行的結果如下:
下一步,加上圖 片吧…沒圖片很難有真相,圖片需要先放到res/drawable-xxxx目錄中(這裡只有放到res/drawable-hdpi中),抓取圖片用R.drawable.pic,不過因為HashMap的value部份需要用圖片(R.drawable.pic),是一個int的型態,所以HashMap的value部份需要改為Object,才能容得下int和string的類型。先將用於list的項目用的layout改一下,加上圖片在標題的左邊:
1 | <?xml version="1.0" encoding="utf-8"?> |
1 | ArrayList<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>(); |
執行的結果如下:
寫到這裡寫得篇幅有點多了,這只是把一些基本的listview顯示資料的方式記錄下來而已,還沒真正開始進行操作。
以上圖片和文字僅供參考。
接下來的部份還在另一篇listview的文章中繼續來研究。
wow
回覆刪除thanks for sharing!