Android學習筆記之ListView

<1>簡介
在android開發中ListView是比較常用的組件,它以列表的形式展示具體內容,並且能夠根據數據的長度自適應顯示。
列表的顯示需要三個元素:
1.ListVeiw 用來展示列表的View。
2.適配器 用來把數據映射到ListView上的中介。
3.數據    具體的將被映射的字符串,圖片,或者基本組件。
根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最為簡單,隻能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對數據庫的簡單結合,可以方面的把數據庫的內容以列表的形式展示出來。
<2>類繼承
java.lang.Object
      android.view.View
        android.view.ViewGroup
                            android.widget.AdapterView<T extends android.widget.Adapter>
                              android.widget.AbsListView
                                   android.widget.ListView
 
<3>XML屬性
 

屬性名稱

描述

android:choiceMode

規定此ListView所使用的選擇模式。缺省狀態下,list沒有選擇模式。

屬性值必須設置為下列常量之一: none,值為0,表示無選擇模式;

singleChoice,值為1,表示最多可以有一項被選中;

multipleChoice,值為2,表示可以多項被選中。

可參看全局屬性資源符號choiceMode。

android:pider

規定List項目之間用某個圖形或顏色來分隔。可以用"@[+][package:]type:name"或者"?[package:][type:]name"(主題屬性)的形式來指向某個已有資源;也可以用"#rgb","#argb","#rrggbb"或者"#aarrggbb"的格式來表示某個顏色。

可參看全局屬性資源符號pider。

android:piderHeight

分隔符的高度。若沒有指明高度,則用此分隔符固有的高度。必須為帶單位的浮點數,如"14.5sp"。可用的單位如px(pixel像素),dp(density-independent pixels 與密集度無關的像素), sp(scaled pixels based on preferred font size基於字體大小的固定比例的像素), in (inches英寸), mm (millimeters毫米)。

可以用"@[package:]type:name

"或者"?[package:][type:]name"(主題屬性)的格式來指向某個包含此類型值的資源。

可參看全局屬性資源符號piderHeight。

android:entries

引用一個將使用在此ListView裡的數組。若數組是固定的,使用此屬性將比在程序中寫入更為簡單。

必須以"@[+][package:]type:name"或者 "?[package:][type:]name"的形式來指向某個資源。

可參看全局屬性資源符號entries。

android:footerDividersEnabled

設成flase時,此ListView將不會在頁腳視圖前畫分隔符。此屬性缺省值為true。

屬性值必須設置為true或false。

可以用"@[package:]type:name

"或者"?[package:][type:]name"(主題屬性)的格式來指向某個包含此類型值的資源。

可參看全局屬性資源符號footerDividersEnabled。

android:headerDividersEnabled

設成flase時,此ListView將不會在頁眉視圖後畫分隔符。此屬性缺省值為true。

屬性值必須設置為true或false。

可以用"@[package:]type:name

"或者"?[package:][type:]name"(主題屬性)的格式來指向某個包含此類型值的資源。

可參看全局屬性資源符號headerDividersEnabled。

<4>公共方法
         public void addFooterView (View v)
         加一個固定顯示於list底部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。
         註意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header view和footer view的ListView。
  參數
                  v      要加的視圖
    public void addFooterView (View v, Object data, boolean isSelectable)
         加一個固定顯示於list底部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。
         註意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header view和footer view的ListView。
  參數
                  v                         要加的視圖
                  data                   和此視圖關聯的數據
                  isSelectable      設為true則表示footer view可以被選中
 public void addHeaderView (View v)
         加一個固定顯示於list頂部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。
         註意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header view和footer view的ListView。
  參數
                 v      要加的視圖
 public void addHeaderView (View v, Object data, boolean isSelectable)
         加一個固定顯示於list頂部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。
         註意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header view和footer view的ListView。
  參數
                  v                         要加的視圖
                  data                   和此視圖關聯的數據
                  isSelectable      表示此header view可選與否
 public void clearChoices ()
         取消之前設置的任何選擇
 public boolean dispatchKeyEvent (KeyEvent event)
         按照可以獲得焦點的順序(從視圖樹的頂端到當前獲得焦點的視圖),分派一個按鍵事件給下一個視圖。若此視圖有焦點,事件將會分派給它自己。否則它將按照順序,分派給下一個節點。此方法同時觸動所有按鍵監聽器。
           參數
                   event                 被分派的事件
           返回
                   若事件被處理,則返回true;否則為false
 public boolean dispatchPopulateAccessibilityEvent (AccessibilityEvent event)
         在視圖的子項目被構建時,分派一個輔助事件。
                  參數
                            event                 事件
                  返回
                            若事件全部完成,則返回true
 public ListAdapter getAdapter ()
         返回ListView當前用的適配器。返回的適配器不可以和傳給setAdapter(ListAdapter)的參數一樣,但是可以是WrapperListAdapter。
                  返回
                            當前用來顯示ListView中數據的適配器
                  參見
                            setAdapter(ListAdapter)
 public long[] getCheckItemIds ()
  此方法已經過時瞭。使用getCheckedItemIds()代替。
         返回被選中項目的索引集合。隻有當選擇模式沒有被設置為CHOICE_MODE_NONE時才有效。
 public long[] getCheckedItemIds ()
         返回被選中項目的索引集合。隻有當選擇模式沒有被設置為CHOICE_MODE_NONE,並且適配器有穩定的ID(hasStableIds()==true)時,結果才有效。
           返回
                   一個新的數組,包含列表中每個被選中的索引(id)
 public int getCheckedItemPosition ()
         返回當前被選中的項目。隻有當選擇模式已被設置為CHOICE_MODE_SINGLE時,結果才有效。
           返回
                返回當前被選中的項目的索引;若沒有項目被選中,則返回INVALID_POSITION
               參見
                 setChoiceMode(int)
 public SparseBooleanArray getCheckedItemPositions ()
         返回當前被選中的項目集合。隻有當選擇模式沒有被設置為CHOICE_MODE_NONE時,結果才有效。
           返回
                類型為SparseBooleanArray的值,其中,對每一個索引所代表的項目,若被選中,則返回true;當選擇模式被設置為CHOICE_MODE_NONE時,返回null。
 public int getChoiceMode ()
                  返回
                            返回當前的選擇模式
                  參見
                            setChoiceMode(int)
 public Drawable getDivider ()
                  返回
                            返回當前畫在列表元素之間,作為分隔符的圖形
 public int getDividerHeight ()
                  返回
                            返回分隔符的高度
 public int getFooterViewsCount ()
                  返回
                            列表中的頁腳視圖數量;缺省實現時,數量為0
 public int getHeaderViewsCount ()
                  返回
                            列表中的頁眉視圖數量;缺省實現時,數量為0
 public boolean getItemsCanFocus ()
                  返回
                            ListAdapter所生成的視圖是否可以包含能取得焦點的項目
 public int getMaxScrollAmount ()
           返回
                   The maximum amount a list view will scroll in response to an arrow event.
                   響應箭頭事件時,列表視圖可以滾動的最大值。(譯者註:此處翻譯待改進,恐怕需要仔細查看源代碼才能明白其含義,也可以用Google Code搜索相關的代碼)
 public boolean isItemChecked (int position)
         對於由position指定的項目,返回其是否被選中。隻有當選擇模式已被設置為CHOICE_MODE_SINGLE或CHOICE_MODE_MULTIPLE時,結果才有效。
                  參數
                            position                      要返回選中狀態的項目
                  返回
                            返回項目的選中狀態;若選擇模式無效,則返回false
 public boolean onKeyDown (int keyCode, KeyEvent event)
         KeyEvent.Callback.onKeyMultiple()的缺省實現:若視圖被激活並且可以被點擊,當出現KEYCODE_DPAD_CENTER和KEYCODE_ENTER代表的行為時,做點擊該視圖的動作。
                  參數
                            keyCode                     表示按某個按鍵的按鍵代號,參見KeyEvent
                            event                          定義按鍵動作的按鍵事件對象
                  返回
                            若事件被成功處理,則返回true;若想要下一個接收器處理該事件,則返回false
 public boolean onKeyMultiple (int keyCode, int repeatCount, KeyEvent event)
         KeyEvent.Callback.onKeyMultiple()的缺省實現:總是返回false(不處理該事件)。
                  參數
                            keyCode                     表示按某個按鍵的按鍵代號,參見KeyEvent
                            repeatedCount         實現動作的次數
                            event                          定義按鍵動作的按鍵事件對象
                  返回
                            若事件被成功處理,則返回true;若想要下一個接收器處理該事件,則返回false
 public boolean onKeyUp (int keyCode, KeyEvent event)
         KeyEvent.Callback.onKeyMultiple()的缺省實現:當出現KEYCODE_DPAD_CENTER和KEYCODE_ENTER代表的行為時,做點擊該視圖的動作。
                  參數
                            keyCode                     表示按某個按鍵的按鍵代號,參見KeyEvent
                            event                          定義按鍵動作的按鍵事件對象
                  返回
                            若事件被成功處理,則返回true;若想要下一個接收器處理該事件,則返回false
 public void onRestoreInstanceState (Parcelable state)
         重新創建並顯示一個視圖,此視圖擁有之前onSaveInstanceState()保存的內部狀態。當state為null時,此方法不會被調用。
                  參數
                            state                          之前onSaveInstanceState()保存的狀態
 public Parcelable onSaveInstanceState ()
         保存視圖的內部狀態,用於以後創建新的擁有同樣狀態的實例。可保存的狀態隻包含非持久性的,或者可重新組建的信息。比如,永遠不可能保存你當前在屏幕上的位置,因為當新的實例被放置於視圖層次體系中時,位置會被重新計算。
         一些可以被保存的狀態:文本視圖(但是通常不是指文本本身,因為文本是被保存在內容提供商或其他持久性的儲存體中)中當前的光標位置;列表視圖中當前的選中項。
  返回                 
  返回一個包含視圖當前動態狀態的接口方法對象;若沒有東西被保存,則返回null。缺省情況下返回null。
 public boolean onTouchEvent (MotionEvent ev)
         此方法用於處理觸摸屏的動作事件。
                  參數
                            ev                        動作事件
                  返回
                            若事件被成功處理,則返回true;否則返回false
 public boolean performItemClick (View view, int position, long id)
         調用定義好的OnItemClickListener。
                  參數
                            view                   AdapterView中被點擊到的視圖
                            position             視圖在適配器中的索引
                            id                         被點擊到的項目的行id
                  返回
                            若有定義好的OnItemClickListener被成功調用,則返回true;否則返回false
 public boolean removeFooterView (View v)
         刪除之前加入的某個頁腳視圖。
                  參數
                            v                 要刪除的視圖
                  返回
                            若視圖被成功刪除,則返回true;若此視圖不是頁腳視圖,則返回false
 public boolean removeHeaderView (View v)
         刪除之前加入的某個頁眉視圖。
                  參數
                            v                 要刪除的視圖
                  返回
                            若視圖被成功刪除,則返回true;若此視圖不是頁眉視圖,則返回false            
 public boolean requestChildRectangleOnScreen (View child, Rect rect, boolean immediate)
         當組裡的某個子項需要被定位在屏幕的某個矩形范圍時,調用此方法。   
         重載此方法的ViewGroup可確認以下幾點:
                   ·子項目將是組裡的直系子項
                   ·矩形將在子項目的坐標體系中
         重載此方法的ViewGroup必須保證以下幾點:
                   ·若矩形已經是可見的,則沒有東西會改變
                   ·為使矩形區域全部可見,視圖將可以被滾動顯示
                  參數
                            child                   發出請求的子項目
                            rect                    子項目坐標系內的矩形,即此子項目希望在屏幕上的定位
                            immediate        設為true,則禁止動畫和緩釋移動滾動條
                  返回
                            這個可滾動顯示的組,是否接受請求
 public void setAdapter (ListAdapter adapter)
         設置ListView背後的數據。根據ListView目前使用的特性,adapter可能被WrapperListAdapter收起。例如:加頁眉和/或頁腳會使adapter被收起。
                  參數
                            adapter             負責維護列表背後的數據,以及生成視圖來顯示數據裡的項目
                  參見
                            getAdapter()           
 public void setCacheColorHint (int color)
         當color的值不為0時,此值表示的顏色將提示使用者,列表正在一片單色不透明的背景上被畫出。
                  參數
                            color                  背景色
 public void setChoiceMode (int choiceMode)
         設置List的選擇模式。缺省情況下,列表沒有選擇模式(即值為CHOICE_MODE_NONE)。
                  參數
                            choiceMode              值可為CHOICE_MODE_NONE,CHOICE_MODE_NONE和CHOICE_MODE_NONE中的一種
 public void setDivider (Drawable pider)
         設置將畫在列表中每個項目之間的圖形。如果圖形沒有已設定好的高度,則必須同時調用setDividerHeight(int)。
                  參數
                            pider               將用作分隔符的圖形
 public void setDividerHeight (int height)
         設置分隔符(畫在列表中每個項目之間)的高度。調用此方法將覆蓋由setDivider(Drawable)設置的高度。
                  參數
                            height       分隔符的新高度,單位為像素
 public void setFooterDividersEnabled (boolean footerDividersEnabled)
         設置可以或者不可以為頁腳視圖畫上分隔符。
                  參數
                            headerDividersEnabled           設為true,表明可以畫;設為false則不可以
                  參見
                            setHeaderDividerEnabled(boolean)
                            addFooterView(android.view.View)
 public void setHeaderDividersEnabled (boolean headerDividersEnabled)
         設置可以或者不可以為頁眉視圖畫上分隔符。
                  參數
                            headerDividersEnabled           設為true,表明可以畫;設為false則不可以
                  參見
                            setFooterDividerEnabled(boolean)
                            addHeaderView(android.view.View)
 public void setItemChecked (int position, boolean value)
         設置position所指定項目的選擇狀態。隻有選擇模式為CHOICE_MODE_SINGLE或者CHOICE_MODE_MULTIPLE時,此設置才有效。
                  參數
                            position             需要改變選擇狀態的項目的索引
                            value                  新的選擇狀態
 public void setItemsCanFocus (boolean itemsCanFocus)
         表明在由ListAdapter創建的視圖中,可包含能獲得焦點的項目。
                  參數
                            itemsCanFocus         若項目能獲得焦點,則設為true;否則為false
 public void setSelection (int position)
         選中position指定的項目。若為觸摸模式,則指定項目不會被選中,但位置變化一樣。若position的值小於0,則position為0的項目將被選中。
                  參數
                            position             需要選中的項目的索引(從0開始)
 public void setSelectionAfterHeaderView ()
         選中頁眉視圖下的第一個列表項目。
 public void setSelectionFromTop (int position, int y)
         選中position指定的項目,並將所選項置於距離ListView頂端y像素的位置(若為觸摸模式,則指定項目不會被選中,但位置變化一樣)。
                  參數
                            position             需要選中的項目的索引(從0開始)
                            y                      距離ListView(包括間隙)頂端的位置
 
<5>參考鏈接
           Android API 中文(42) ——ListView(大部分引用來自此文)
           Android開發之ListView頁眉頁腳效果VS android背景漸變
           QQ 多級列表的實現
           Android 中ListView 分頁加載數據
           Android ExpandableListView 展開列表控件(手機QQ好友列表)
                   Android入門第六篇之ListView (一)
                   android ListView詳解
                   android異步加載ListView中的圖片
                   Google I/O 2010 – The world of ListView
                   Android: 顯示SD卡文件列表
                   Android: 帶圖標的ListView實現
                   ListView和getView的原理+如何在ListView中放置多個item


<6>范例
 
 
package xiaosi.listview; 
 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Map; 
 
import android.app.ListActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.SimpleAdapter; 
 
public class ListView extends ListActivity { 
    /** Called when the activity is first created. */ 
    private ArrayList<Map<String,Object>> list = null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
         
        String[] Headline = new String[]{"logo","ID","user"}; 
        int[] ViewID = new int[]{R.id.logo,R.id.ID,R.id.user}; 
         
        list = new ArrayList<Map<String,Object>>(); 
        Map<String,Object>  hashmap1 = new HashMap<String,Object>(); 
        Map<String,Object>  hashmap2 = new HashMap<String,Object>(); 
        Map<String,Object>  hashmap3 = new HashMap<String,Object>(); 
        Map<String,Object>  hashmap4 = new HashMap<String,Object>(); 
        Map<String,Object>  hashmap5 = new HashMap<String,Object>(); 
         
        hashmap1.put("logo",R.drawable.a); 
        hashmap1.put("ID","X000001"); 
        hashmap1.put("user","響鈴"); 
         
        hashmap2.put("logo",R.drawable.b); 
        hashmap2.put("ID","X000002"); 
        hashmap2.put("user","記事本"); 
         
        hashmap3.put("logo",R.drawable.c); 
        hashmap3.put("ID","X000003"); 
        hashmap3.put("user","音樂"); 
         
        hashmap4.put("logo",R.drawable.d); 
        hashmap4.put("ID","X000004"); 
        hashmap4.put("user","系統"); 
         
        hashmap5.put("logo",R.drawable.e); 
        hashmap5.put("ID","X000005"); 
        hashmap5.put("user","警告"); 
         
        list.add(hashmap1); 
        list.add(hashmap2); 
        list.add(hashmap3); 
        list.add(hashmap4); 
        list.add(hashmap5); 
         
        SimpleAdapter simpleadapter = new SimpleAdapter(this, list, R.layout.user,Headline, ViewID); 
        setListAdapter(simpleadapter); 
         
    } 
     
    @Override 
    protected void onListItemClick(android.widget.ListView l, View v, 
            int position, long id) { 
        // TODO Auto-generated method stub  
        super.onListItemClick(l, v, position, id); 
        System.out.println("position:" + position); 
        System.out.println("id:" + id); 
    } 
     
     

 
 
main.xml
 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
 
    <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello" /> 
    <ListView  
        android:id="@id/android:list" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:scrollbars="vertical" 
        android:choiceMode="multipleChoice"/> 
</LinearLayout> 
 
 
user.xml
 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" > 
    <ImageView  
        android:id="@+id/logo" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 
    <TextView 
        android:id="@+id/ID" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 
    <TextView 
        android:id="@+id/user" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 
     
</LinearLayout>   

http://up.aiwalls.com/2012/0203/20120203024435809.rar

發佈留言