Android--UI之ListView


前言

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

  效果展示:

  源碼下載

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

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM