ListView是手機系統中使用非常廣泛的一種組件,它以垂直列表的形式顯示所有列表項。
創建ListView有兩種方式:
- 直接使用ListView創建。
- 讓Activity繼承ListActivity。
一旦在程序中獲得ListView之后,接下來需要為ListView設置它要顯示的列表項了。在這一點上,ListView與前面介紹的AutoComplete、Spinner類似,他們都需要一個供顯示的列表項,這就需要借助於內容Adapter了,內容Adapter負責提供需要顯示的列表項。
ListView的常用XML屬性
XML屬性 | 說明 |
android:choiceMode | 設置ListView的選擇行為 |
android:divider | 設置list列表項的分隔條(既可用顏色分隔,也可用用Drawable分隔) |
android:dividerHeight | 設置分隔條的高度 |
android:entries | 指定一個數組資源,android將根據該數組資源來生成ListView |
android:footerDividersEnabled | 如果設置為false,則不在footer view之前繪制隔條 |
android:headerDividersEnabled | 如果設置為false,則不在header view之后繪制隔條 |
頁面布局代碼:layout/main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <!-- 直接使用數組資源給出列表項 --> 8 <ListView 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:entries="@array/books" 12 android:divider="@drawable/red" 13 android:headerDividersEnabled="false" 14 /> 15 <!-- 使用ArrayAdapter提供列表項的ListView --> 16 <ListView 17 android:id="@+id/list2" 18 android:layout_width="fill_parent" 19 android:layout_height="wrap_content" 20 android:divider="@drawable/green" 21 /> 22 </LinearLayout>
頁面布局代碼里面寫了兩個ListView,第一個通過android:entries指定了列表數組,第二個通過ArrayAdapter使用數組提供列表項。
1 package com.yangjing.arrayadapterlist; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.widget.ArrayAdapter; 6 import android.widget.ListView; 7 8 public class Arrayadapterlist extends Activity{ 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 // TODO Auto-generated method stub 13 super.onCreate(savedInstanceState); 14 setContentView(R.layout.main); 15 ListView list2 = (ListView)findViewById(R.id.list2); 16 //定義一個數組 17 String[] arr ={"小智", "小剛" , "大木博士"}; 18 //將數組包裝ArrayAdapter 19 ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>( 20 this , android.R.layout.simple_list_item_1 , arr); 21 //為ListView設置Adapter 22 list2.setAdapter(arrayAdapter); 23 } 24 }
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this , android.R.layout.simple_list_item_1 , arr);
創建ArrayAdapter時必須指定一textViewResourceId,該參數決定每個列表項的外觀形式。Android為該屬性提供了如下屬性值:
- simple_list_item_1:每一個列表項都是普通的textView
- simple_list_item_2:每一個列表項都是普通的textView(字體略大)
- simple_list_item_checked:每一個列表項都是一個已勾選的列表項
- simple_list_item_multiple_choice:每個列表項都是帶多選框的文本
- simple_list_item_single_choice:每個列表項都是帶多單選按鈕的文本
最初運行的效果:
將上面創建的arrayadapter改為:ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
this , android.R.layout.simple_list_item_single_choice , arr);
效果如下:
實例:基於ListActivity實現列表
如果程序的窗口僅僅需要顯示一個列表,則可以直接讓Activity繼承ListActivity來實現,ListActivity的子類無需調用setContentView()方法來顯示某個界面,而是直接傳入一個Adapter,ListActivity的類就呈現出一個列表。
比如下面的程序:
界面程序:main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 7 <ListView android:id="@+id/android:list" 8 android:layout_width="match_parent" 9 android:layout_height="match_parent" 10 android:background="#0000ff" 11 android:layout_weight="1" 12 android:drawSelectorOnTop="false"></ListView> 13 14 <!-- ① android:drawSelectorOnTop="true" 點擊某一條記錄,顏色會顯示在最上面,記錄上的文字被遮住,所以點擊文字不放,文字就看不到 15 16 ② android:drawSelectorOnTop="false" 點擊某條記錄不放,顏色會在記錄的后面,成為背景色,但是記錄內容的文字是可見的 --> 17 </LinearLayout>
主java程序:ListActivityTest.java
1 package com.yangjing.listactivitytest; 2 3 import android.app.ListActivity; 4 import android.os.Bundle; 5 import android.widget.ArrayAdapter; 6 7 public class ListActivityTest extends ListActivity{ 8 9 @Override 10 protected void onCreate(Bundle savedInstanceState) { 11 super.onCreate(savedInstanceState); 12 //設置使用自己的界面 13 //setContentView(R.layout.main); 14 String[] arr = {"小獅","靈感","離","小黑","放生","靈"}; 15 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,arr); 16 //設置窗口顯示列表 17 setListAdapter(adapter); 18 } 19 20 }
效果如下:
使用SimpleAdapter創建ListView
關於SimpleAdapter的一些解釋以及他的構成:
這是一個簡單的適配器,可以將靜態數據映射到XML文件中定義好的視圖。你可以指定由Map組成的List(比如ArrayList)類型的數據。在ArrayList中的每個條目對應List中的一行。
Maps包含每一行的數據。你可以指定一個XML布局以指定每一行的視圖,根據Map中的數據映射關鍵字到指定的視圖。綁定數據到視圖分兩個階段,首先,如果設置了SimpleAdapter.ViewBinder,
那么這個設置的ViewBinder的setViewValue(android.view.View, Object, String)將被調用。如果setViewValue的返回值是true,則表示綁定已經完成,將不再調用系統默認的綁定實現。
如果返回值為false,視圖將按以下順序綁定數據: 如果View實現了Checkable(例如CheckBox),期望綁定值是一個布爾類型。 TextView.期望綁定值是一個字符串類型,通過調用setViewText(TextView, String)綁定。 ImageView,期望綁定值是一個資源id或者一個字符串,通過調用setViewImage(ImageView, int) 或 setViewImage(ImageView, String)綁定數據。 如果沒有一個合適的綁定發生將會拋出IllegalStateException。
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
參數:
- context:上下文,比如this。關聯SimpleAdapter運行的視圖上下文
- data:Map列表,列表要顯示的數據,這部分需要自己實現,類型要與上面的一致,每條項目要與from中指定條目一致
- resource:ListView單項布局文件的Id,這個布局就是你自定義的布局了,你想顯示什么樣子的布局都在這個布局中。這個布局中必須包括了to中定義的控件id
- from:一個被添加到Map上關聯每一個項目列名稱的列表,數組里面是列名稱
- to:是一個int數組,數組里面的id是自定義布局中各個控件的id,需要與上面的from對應
下面用個實例解釋下SimpleAdapter的用法:
界面程序:main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 <!-- 定義一個ListView --> 7 <ListView android:id="@+id/mylist" 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content"></ListView> 10 11 <!-- 定義一個ImageView,作為列表項的一部分 --> 12 <ImageView android:id="@+id/header" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:paddingLeft="10dp"/> 16 17 <!-- 定義一個TextView,用於作為列表項的一部分 --> 18 <TextView android:id="@+id/name" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:textSize="16dp" 22 android:gravity="center_vertical" 23 android:paddingLeft="10dp"/> 24 </LinearLayout>
主程序:SimpleAdapterTest.java
1 package com.yangjing.simpleadaptertest; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 import java.util.Map; 7 8 import android.app.Activity; 9 import android.os.Bundle; 10 import android.widget.ListView; 11 import android.widget.SimpleAdapter; 12 13 public class SimpleAdapterTest extends Activity{ 14 15 //首先定義好name和頭像 16 private String[] names = new String[]{"小獅","靈感","離","小黑"}; 17 18 private int[] imageIds = new int[]{R.drawable.tiger,R.drawable.nongyu,R.drawable.libai,R.drawable.qingzhao}; 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.main); 24 25 //創建一個list集合,list集合元素是Map 26 List<Map<String, Object>> listItems = new ArrayList<Map<String,Object>>(); 27 28 for (int i = 0; i < names.length; i++) { 29 Map<String, Object> listItem = new HashMap<String, Object>(); 30 listItem.put("header", imageIds[i]); 31 listItem.put("personName", names[i]); 32 listItems.add(listItem); 33 } 34 35 SimpleAdapter simpleAdapter = new SimpleAdapter( 36 this, 37 listItems, 38 R.layout.main, 39 new String[]{"header","personName"}, 40 new int[]{R.id.header,R.id.name}); 41 ListView list = (ListView) findViewById(R.id.mylist); 42 //為ListView設置Adapter 43 list.setAdapter(simpleAdapter); 44 } 45 }
效果如下: