(Android)五分鐘讓你輕鬆學會ListView單選和多選功能

在實現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 ,第一時間推送博文源碼




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章