Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 布局與控件(八)-ListView知多少(下)ChoiceMode詳解

布局與控件(八)-ListView知多少(下)ChoiceMode詳解

編輯:關於Android編程

9.4 ListView的Choice Mode

ListView本身帶有單選和多選功能,也就是說在單選模式下,它能夠記住當前選中的唯一的列表項;在多選模式下,它能夠記住目前選取的所有的列表項。

這種選擇模式共有4種CHOICE_MODE_NONE CHOICE_MODE_SINGLE CHOICE_MODE_MULTIPLE CHOICE_MODE_MULTIPLE_MODAL

使用setChoiceMode()函數,就可以設置ListView的選擇模式。

ListView lv = (ListView) findViewById(R.id.list_view);
lv.setChoiceMode(ListView.CHOICE_MODE_NONE);

9.4.1 CHOICE_MODE_NONE

這是ListView默認的選擇模式,當使用者點擊列表項後,不會將任何點擊的列表項當成被選擇上的列表項。

9.4.2 CHOICE_MODE_SINGLE

使用這個選項模式,當使用者點擊列表項後,會將最後一次點擊的列表項當成被選擇上的列表項。

ArrayAdapter adapter = new ArrayAdapter(this, 
                android.R.layout.simple_list_item_single_choice , datalist);
lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
lv.setAdapter(adapter);

每次點擊列表項,可以在它的監聽函數中得知那個列表項被點擊了,

lv.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        //添加需要響應的操作
    }
}

以後就可以通過ListViewgetCheckedItemPositions()獲取被選中的數據項的位置列表,

SparseBooleanArray checkedItems = lv.getCheckedItemPositions();

例如,當列表項按照序號為3->2->1-7的順序被點擊後,7將被記錄下來,作為當前被選中的數據項。調用getCheckedItemPositions()後,將得到一個鍵值對,裡面只會記錄,

key=7, value=true

這裡為了看到被選中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_single_choice布局,作為列表項的布局。

\

9.4.3 CHOICE_MODE_MULTIPLE

使用這個選項模式,當使用者點擊列表項後,會將所有點擊的列表項當成被選擇上的列表項。

ArrayAdapter adapter = new ArrayAdapter(this, 
                android.R.layout.simple_list_item_multiple_choice, datalist);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lv.setAdapter(adapter);

每次點擊列表項,可以在它的監聽函數中得知那個列表項被點擊了,

lv.setOnItemClickListener(new ListView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        //添加需要響應的操作
    }
}

通過ListViewgetCheckedItemPositions()獲取被選中的數據項的位置列表,

SparseBooleanArray checkedItems = lv.getCheckedItemPositions();

例如,當列表項按照序號為3->2->1->7的順序被點擊後,3 2 1 7將被記錄下來,作為當前被選中的數據項。調用getCheckedItemPositions()後,將得到一個個鍵值對,裡面會記錄,

key=1, value=true
key=2, value=true
key=3, value=true
key=7, value=true

這些記錄,將按照列表項的位置從小到大排列。

如果用戶在已經被選上的數據項上,又再次點擊,這將取消對它的選擇。例如,當列表項按照序號為3->2->1->7->2->1的順序被點擊後,就變成了,

key=1, value=false
key=2, value=false
key=3, value=true
key=7, value=true

對於被取消了選擇的列表項,並不會從記錄中移除,而是改變它的值成false

這裡為了看到被選中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice布局,作為列表項的布局。

\

9.4.4 CHOICE_MODE_MULTIPLE_MODAL

CHOICE_MODE_MULTIPLE模式中,當用戶必須通過長按任意一個列表項,進入多選模式,否則不能進行多選。

\

這個模式的使用與CHOICE_MODE_MULTIPLE類似,不過它需要設置一個ActionMode,這樣才能在長按列表項後,改變ActionBar的菜單欄,打開多選的菜單。

實現ListViewMultiChoiceModeListener接口,

private class MyMultiChoiceModeListener implements ListView.MultiChoiceModeListener {

    @Override
    public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {

        //添加列表項被點擊後的響應
    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        //這裡返回true
        return true;
    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        //這裡返回true
        return true;
    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        //這裡返回true
        return true;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }
}

使用創建的接口,傳遞給ListView

ArrayAdapter adapter = new ArrayAdapter(this, 
                android.R.layout.simple_list_item_multiple_choice, datalist);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

ListView.MultiChoiceModeListener callback = new MyMultiChoiceModeListener();
lv.setMultiChoiceModeListener(callback);
lv.setAdapter(adapter);

CHOICE_MODE_MULTIPLE_MODAL模式下,對列表項的點擊,是在ListView.MultiChoiceModeListeneronItemCheckedStateChanged()函數中響應的。

這裡為了看到被選中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice布局,作為列表項的布局。

9.4.5 關於單選和多選的狀態背景

前面的演示中,分別對不同的選擇模式,使用了不同的數據項布局,

CHOICE_MODE_SINGLE         --> android.R.layout.simple_list_item_single_choice
CHOICE_MODE_MULTIPLE       --> android.R.layout.simple_list_item_multiple_choice
CHOICE_MODE_MULTIPLE_MODAL --> android.R.layout.simple_list_item_multiple_choice

我們也可以選擇自己的布局來實現。但是不管使用什麼布局,我們都希望被選上的列表項有特別的效果,和其他沒有被選上的數據項區別開。這裡有兩種方案,

使用實現了Clickable接口的控件或者布局,作為數據項的布局。例如前面我們使用的android.R.layout.simple_list_item_multiple_choice android.R.layout.simple_list_item_single_choice等,它們本身就是CheckedTextView。當點擊它們的時候,它們就自帶了勾選框,可以看到效果。

所以,可以選擇CheckBox Switch這類同樣實現了Clickable接口的布局來表現;也可以自定義一個實現了Clickable接口的布局。這裡用android.R.layout.simple_list_item_multiple_choice的實現來舉個例子,

給數據項的布局使用一個Selector,告訴這個布局,當它被activated以後要怎麼顯示。比如,定義一個布局custom_item_layout.xml,

 為了布局好看設置一個最小高度
    android:gravity="center_vertical"
    android:padding="5dp"
    android:background="@drawable/selector">

給這個布局設計一個selector,增加對android:activated屬性的設置,


    

使用這個這個布局,

ArrayAdapter adapter = new ArrayAdapter(this, 
                R.layout.custom_item_layout, datalist);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lv.setAdapter(adapter);

當我們多選的時候,那些選中項,就變成黃色,看到如下的界面,

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