Android 自學之列表視圖ListView和ListActivity


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 }

 

效果如下:

 


免責聲明!

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



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