編輯:關於Android編程
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);
這是ListView
默認的選擇模式,當使用者點擊列表項後,不會將任何點擊的列表項當成被選擇上的列表項。
使用這個選項模式,當使用者點擊列表項後,會將最後一次點擊的列表項當成被選擇上的列表項。
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) {
//添加需要響應的操作
}
}
以後就可以通過ListView
的getCheckedItemPositions()
獲取被選中的數據項的位置列表,
SparseBooleanArray checkedItems = lv.getCheckedItemPositions();
例如,當列表項按照序號為3->2->1-7
的順序被點擊後,7
將被記錄下來,作為當前被選中的數據項。調用getCheckedItemPositions()
後,將得到一個鍵值對,裡面只會記錄,
key=7, value=true
這裡為了看到被選中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_single_choice
布局,作為列表項的布局。
使用這個選項模式,當使用者點擊列表項後,會將所有點擊的列表項當成被選擇上的列表項。
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) {
//添加需要響應的操作
}
}
通過ListView
的getCheckedItemPositions()
獲取被選中的數據項的位置列表,
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
布局,作為列表項的布局。
在CHOICE_MODE_MULTIPLE
模式中,當用戶必須通過長按任意一個列表項,進入多選模式,否則不能進行多選。
這個模式的使用與CHOICE_MODE_MULTIPLE
類似,不過它需要設置一個ActionMode
,這樣才能在長按列表項後,改變ActionBar
的菜單欄,打開多選的菜單。
實現ListView
的MultiChoiceModeListener
接口,
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.MultiChoiceModeListener
的onItemCheckedStateChanged()
函數中響應的。
這裡為了看到被選中的效果,采用了Android SDK提供的android.R.layout.simple_list_item_multiple_choice
布局,作為列表項的布局。
前面的演示中,分別對不同的選擇模式,使用了不同的數據項布局,
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);
當我們多選的時候,那些選中項,就變成黃色,看到如下的界面,
這次直接找一個JavaEE版本的Eclipse解壓到我們想安裝的目錄下即可,用過 Eclipse+ADT 開發 Android 的同學都知道 Eclipse 是免安裝的,
最近在使用Android Studio 進行開發一款應用,涉及到新浪的登錄,但是新浪登錄的sdk需要引用so文件,用Studio找了半天沒找到合適的方法,不想
效果預覽源代碼傳送門:https://github.com/yanzhenjie/CircleTextProgressbar實現與原理這個文字圓形的進度條我們在很多APP
最近用到了AsyncTask,這玩意每個寫android程序的都會用,可是不見得每個人都能用的好。如果想要用好,那麼首先勢必對基本原理有個大概了解。其實網上對這類問題的說