Android學習筆記之ListView

jopen 12年前發布 | 37K 次閱讀 Android Android開發 移動開發

<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:divider

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

可參看全局屬性資源符號divider

android:dividerHeight

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

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

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

可參看全局屬性資源符號dividerHeight

android:entries

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

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

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

android:footerDividersEnabled

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

屬性值必須設置為truefalse

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

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

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

android:headerDividersEnabled

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

屬性值必須設置為truefalse

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

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

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

<4>公共方法

         public void addFooterView (View v)

         加一個固定顯示于list底部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。

         注意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header viewfooter viewListView

參數

                v      要加的視圖

    public void addFooterView (View v, Object data, boolean isSelectable)

         加一個固定顯示于list底部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。

         注意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header viewfooter viewListView

參數

                v                         要加的視圖

                data                   和此視圖關聯的數據

                isSelectable      設為true則表示footer view可以被選中

public void addHeaderView (View v)

         加一個固定顯示于list頂部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。

         注意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header viewfooter viewListView

參數

               v      要加的視圖

public void addHeaderView (View v, Object data, boolean isSelectable)

         加一個固定顯示于list頂部的視圖。如果此方法被調用超過一次,所加的幾個視圖將按照它們加入的順序排列。加入的視圖可取得焦點。

         注意:在調用setAdapter之前調用此方法。這樣的話,可以利用點擊光標來收起有header viewfooter viewListView

參數

                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,并且適配器有穩定的 IDhasStableIds()==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_SINGLECHOICE_MODE_MULTIPLE,結果才有效。

                  參數

                            position                      要返回選中狀態的項目

                  返回

                            返回項目的選中狀態;若選擇模式無效,則返回false

public boolean onKeyDown (int keyCode, KeyEvent event)

         KeyEvent.Callback.onKeyMultiple()的缺省實現:若視圖被激活并且可以被點擊,當出現KEYCODE_DPAD_CENTERKEYCODE_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_CENTERKEYCODE_ENTER代表的行為時,做點擊該視圖的動作。

                  參數

                            keyCode                     表示按某個按鍵的按鍵代號,參見KeyEvent

                            event                          定義按鍵動作的按鍵事件對象

                  返回

                            若事件被成功處理,則返回true;若想要下一個接收器處理該事件,則返回false

public void onRestoreInstanceState (Parcelable state)

         重新創建并顯示一個視圖,此視圖擁有之前onSaveInstanceState()保存的內部狀態。當statenull時,此方法不會被調用。

                  參數

                            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_NONECHOICE_MODE_NONECHOICE_MODE_NONE中的一種

public void setDivider (Drawable divider)

         設置將畫在列表中每個項目之間的圖形。如果圖形沒有已設定好的高度,則必須同時調用setDividerHeight(int)

                  參數

                            divider               將用作分隔符的圖形

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,則position0的項目將被選中。

                  參數

                            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實現

<6>范例0_1328246868m82t.gif.jpg

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>
  listview范例.rar

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!