在實現ListView單選時,我們可以在
Adapter中自己創建一個selectPosition參數,
這樣是能實現需求。
但加入要是再加一個多選
接着又在Adapter中創建了一個記錄選中position的集合,也是可以實現的,但是實現起來還是相關繁瑣的。過程很不樂觀。
這裏介紹一種相對簡單的實現方式。
關鍵點,利用ListView中的Choice來實現。
ListView中自帶Choice相關功能,提供單選和多選兩種Choice模式。
我們可以在佈局中設置
android:choiceMode = "singleChoice"
同樣也可以在代碼中處理
lv .setChoiceMode(ListView. CHOICE_MODE_MULTIPLE);
對於api很好理解,顧名思義。我們來看一下
比如 getCheckedItemPosition()就是獲取當前選中的位置, 注意只有單選模式此方法纔有意義
而多選對應的獲取方法爲 getCheckedItemPositions 返回的是一個SparseBooleanArray對象
這個類型相當於map,是一個key爲Integer,value爲Boolean的鍵值對集合,代表激活item選中位置和狀態數據
有點需要注意的是不代表你10個item獲取到的SparseBooleanArray就一定也是size爲10, 他只保存激活的item,
激活是指有過點擊操作有過checked變化的
比如你點擊了兩次第二個item,雖然最後第二個item還是未選中狀態,
但有了操作,集合中就會保存了一個 1=false 的鍵值對數據,代表第二個item當前是未選中,而其他位置的item則不保存
我們來看一下效果圖:
單選:
多選:
我們重點來看
在於ListView的item佈局的處理
被選中的item會設置一個checked狀態, 因此這裏需要Item的根佈局實現過Checkable可選中接口,自定義CheckableLinearLayout 繼承於LinearLayout
public class CheckableLinearLayout extends LinearLayout implements Checkable {
// checked狀態
private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
// 是否選中
private boolean mChecked = false;
public CheckableLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* 判斷是否選中
*/
public boolean isChecked() {
return mChecked;
}
/**
* 設置選中狀態
*/
public void setChecked(boolean b) {
if (b != mChecked) {
mChecked = b;
refreshDrawableState();
}
}
/**
* 切換當前的選中狀態
*/
public void toggle() {
setChecked(!mChecked);
}
@Override
public int[] onCreateDrawableState(int extraSpace) {
// 在原有狀態中添加一個空間space用於保存checked狀態
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (isChecked()) {
// 將checked狀態合併到原有的狀態數組中
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}
return drawableState;
}
}
源碼下載地址
更多源碼請關注微信公衆號:aikaifa ,第一時間推送博文源碼