前言
今天講解一下Android平台下ListView控件的開發,在本篇博客中,將介紹ListView的一些常用屬性、方法及事件,還會講解ListView在開發中常用的幾種方式,以及使用不通用的適配器Adapter定制個性的View視圖用於ListView的展示。
ListView
ListView,列表視圖,直接繼承了AbsListView,是一個以垂直方式在項目中顯示View視圖的列表。ListView的數據項,來自一個繼承了ListAdapter接口的適配器。
ListView的常用屬性一般就是用來設置列表的間隔、分割線、表頭、表尾等屬性的,常用屬性有以下幾個,並且Android也為其提供了對應的setter/getter方法:
- android:divider:使用一個Drawable或者color設置數據項之間的間隔樣式。
- android:dividerHeight:設置數據項之間的間隔距離。
- android:entries:設置一個資源Id用於填充ListView的數據項。
- android:footerDividersEnabled:設定列表表尾是否顯示分割線,如果有表尾的話。
- android:headerDividerEnabled:設定列表表頭是否顯示分割線,如果有表頭的話。
ListView提供了一些方法,用於操作ListView。這里介紹一些常用的方法,更多的請參見API文檔:
- void addFooterView(View v):添加表尾View視圖。
- boolean removeFooterView(View v):移除一個表尾View視圖。
- void addHeaderView(View v):添加一個表頭View視圖。
- boolean removeHeaderView(View v):移除一個表頭View視圖。
- ListAdapter getAdapter():獲取當前綁定的ListAdapter適配器。
- void setAdapter(ListAdapter adapter):設置一個ListAdapter適配器到當前ListView中。
- void setSelection(int posotion):設定當前選中項。
- long[] getCheckItemIds():獲取當前選中項。
作為一個列表選擇控件,ListView具有一些選中選項可以觸發的事件,但它本身沒有定義這些事件,均繼承自間接父類AdapterView。ListView支持的幾個常用事件有以下幾個:
- AdapterView.OnItemCLickListener:列表項被點擊時觸發。
- AdapterView.OnItemLongClickListener:列表項被長按時觸發。
- AdapterView.OnItemSelectedListener:列表項被選擇時觸發。
在Android項目中使用ListView,有兩種方式,一種是通過一個繼承了ListActivity的Activity,在其中設定ListAdapter,對於這種方式,比較適用於整個頁面就是一個ListView;第二種方式就是直接使用ListView控件,這種方式也是項目中比較常用的方式。
ListActivity
ListActivity繼承了Activity,並通過綁定一個ListAdapter來顯示一個數據列表。需要注意的是,如果對列表項的數據格式沒有特殊要求,它完全可以不使用布局文件即可創建一個ListView,因為ListActivity類本身已經包含了一個ListView。因此在onCreate()方法中,不需要調用setContentView()方法來從一個布局文件加載用戶界面。
在ListActivity的onCreate()方法中,可以直接使用this.setListAdapter()方法為這個ListView設定ListAdapter。如果想獲得並操作這個ListActivity自帶的ListView,可以使用this.getListView()方法獲取。
下面通過一個Demo講解一下使用繼承ListActivity的方式來實現ListView,因為這里只是使用一個ArrayAdapter填充數據,無需指定布局文件,這里只提供實現代碼:
1 package com.bgxt.datatimepickerdemo; 2 3 import android.app.ListActivity; 4 import android.os.Bundle; 5 import android.view.View; 6 import android.widget.ArrayAdapter; 7 import android.widget.ListView; 8 import android.widget.TextView; 9 import android.widget.Toast; 10 11 public class ListActivityDemo extends ListActivity { 12 private String[] presidents={"北京","深圳","濟南","廣州","海南","香港","澳門"}; 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 // TODO Auto-generated method stub 17 super.onCreate(savedInstanceState); 18 ListView listview=getListView(); 19 //添加一個TextView作為表頭 20 TextView tvHeader=new TextView(ListActivityDemo.this); 21 tvHeader.setText("城市列表頭"); 22 listview.addHeaderView(tvHeader); 23 //添加一個TextView作為表尾 24 TextView tvFooter=new TextView(ListActivityDemo.this); 25 tvFooter.setText("城市列表尾"); 26 listview.addFooterView(tvFooter); 27 listview.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,presidents)); 28 29 } 30 @Override 31 protected void onListItemClick(ListView parent, View view, int position, long id) { 32 33 Toast.makeText(this, "You have selected "+presidents[position], Toast.LENGTH_SHORT).show(); 34 } 35 }
效果展示:

使用ListView控件構建
上面介紹的這種方式會將整個Activity都作為一個ListView,但是在實際項目中,一般還是把ListView作為一個數據顯示控件,填充在布局中。現在通過一個簡單的Demo,講解使用ListView控件展示一個ArrayAdapter填充的數據列表。
布局代碼:
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 <!-- 設定列表項的分割線為藍色,並且數據項之間分割10個dp --> 7 <ListView 8 android:id="@+id/listviewsimple" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:divider="#00F" 12 android:dividerHeight="10dp"/> 13 </LinearLayout>
實現代碼:
1 package com.bgxt.datatimepickerdemo; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.app.Activity; 7 import android.os.Bundle; 8 import android.widget.ArrayAdapter; 9 import android.widget.ListView; 10 11 public class ListViewSimpleActivity extends Activity { 12 private ListView listview; 13 private ArrayAdapter<String> adapter; 14 private List<String> data; 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 // TODO Auto-generated method stub 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_listviewsimple); 20 getData();//填充數據 21 listview=(ListView)findViewById(R.id.listviewsimple); 22 //設定列表項的選擇模式為單選 23 adapter=new ArrayAdapter<String>(ListViewSimpleActivity.this, android.R.layout.simple_list_item_single_choice, data); 24 listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 25 listview.setAdapter(adapter); 26 } 27 28 private void getData(){ 29 data=new ArrayList<String>(); 30 data.add("北京"); 31 data.add("上海"); 32 data.add("深圳"); 33 data.add("武漢"); 34 data.add("宜昌"); 35 data.add("成都"); 36 data.add("貴陽"); 37 data.add("杭州"); 38 data.add("濟南"); 39 data.add("天津"); 40 } 41 }
效果展示:

使用SimpleAdapter填充數據
ListView的使用范圍很廣,一般也不僅僅用來展示簡單的數據,對於一些復雜樣式的數據而言,可以使用SimpleAdapter這個適配器。對於SimpleAdapter適配器的用法,可以參見我的另外一篇博客:Android--UI之Spinner,這里就不再累述了。
下面直接通過一個Demo講解,在這個Demo中,對於SimpleAdapter填充樣式而言,不再單獨給定模板,直接使用布局的模板。
布局代碼:
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 <LinearLayout 8 android:layout_width="match_parent" 9 android:layout_height="wrap_content" 10 android:orientation="horizontal" > 11 <!-- LinnerLayout定義的三個控件,將成為ListView控件的模板 --> 12 <ImageView 13 android:id="@+id/ivIcon" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:layout_marginLeft="3dp" 17 android:maxHeight="5dp" 18 android:maxWidth="5dp" 19 android:src="@drawable/ic_launcher" /> 20 21 <TextView 22 android:id="@+id/tvName" 23 android:layout_width="wrap_content" 24 android:layout_height="wrap_content" 25 android:layout_marginTop="10dp" 26 android:layout_weight="1" 27 android:text="好友名稱" /> 28 29 <TextView 30 android:id="@+id/tvSS" 31 android:layout_width="wrap_content" 32 android:layout_height="wrap_content" 33 android:layout_marginTop="10dp" 34 android:layout_weight="4" 35 android:text="簽名" /> 36 </LinearLayout> 37 38 <ListView 39 android:id="@+id/lvArray" 40 android:layout_width="match_parent" 41 android:layout_height="wrap_content" /> 42 43 </LinearLayout>
實現代碼:
1 package com.bgxt.datatimepickerdemo; 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 SimpleAdapterActivity extends Activity { 14 private ListView listview; 15 private SimpleAdapter simpleAdapter; 16 private List<Map<String, Object>> data; 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 // TODO Auto-generated method stub 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_listviewarrayadapter); 23 listview = (ListView) findViewById(R.id.lvArray); 24 //填充數據 25 putData(); 26 //這里使用當前的布局資源作為ListView的模板。 27 //使用這種方式,SimpleAdapter會忽略ListView控件,僅以ListView之外的控件作為模板。 28 simpleAdapter = new SimpleAdapter(SimpleAdapterActivity.this, data, 29 R.layout.activity_listviewarrayadapter, new String[] { "icon", 30 "name", "ss" }, new int[] { R.id.ivIcon, R.id.tvName, 31 R.id.tvSS }); 32 listview.setAdapter(simpleAdapter); 33 } 34 35 private void putData() 36 { 37 data=new ArrayList<Map<String,Object>>(); 38 Map<String, Object> map1=new HashMap<String, Object>(); 39 map1.put("icon", R.drawable.item1); 40 map1.put("name", "簡愛"); 41 map1.put("ss", "風將綠了夜的途"); 42 Map<String, Object> map2=new HashMap<String, Object>(); 43 map2.put("icon", R.drawable.item2); 44 map2.put("name", " 陌 陌"); 45 map2.put("ss", "尋找你,你在我心中__。"); 46 Map<String, Object> map3=new HashMap<String, Object>(); 47 map3.put("icon", R.drawable.item3); 48 map3.put("name", "汐顏"); 49 map3.put("ss", "最新分享:中國合伙人正能量22句話..."); 50 Map<String, Object> map4=new HashMap<String, Object>(); 51 map4.put("icon", R.drawable.item4); 52 map4.put("name", "花仙子"); 53 map4.put("ss", " "); 54 data.add(map1); 55 data.add(map2); 56 data.add(map3); 57 data.add(map4); 58 } 59 }
效果展示:

請支持原創,尊重原創,轉載請注明出處。謝謝。

