Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android應用開發入門(二十九)UI控件ListView的使用

Android應用開發入門(二十九)UI控件ListView的使用

編輯:Android開發實例

前言

  今天講解一下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.     }  

 效果展示:

 

使用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.     }  

  效果展示:

 

使用SimpleAdapter填充數據

  ListView的使用范圍很廣,一般也不僅僅用來展示簡單的數據,對於一些復雜樣式的數據而言,可以使用SimpleAdapter這個適配器。對於SimpleAdapter適配器的用法,可以參見我的另外一篇:http://www.fengfly.com/plus/view-213501-1.html,這裡就不再累述了。

  下面直接通過一個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.     }  

  效果展示:

  源碼下載

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