標籤:ListView
ListView使用多選模式好處
互動與資料分離,在多選狀態下不需要修改資料來源,在最後確定的時候擷取選擇索引來確定選擇的資料。
ListView模式
CHOICE_MODE_NONE:普通模式;
CHOICE_MODE_SINGLE:單選模式;
CHOICE_MODE_MULTIPLE:多選模式;
CHOICE_MODE_MULTIPLE_MODAL:多選模式(與ActionMode配合使用)。
設定方式
- XML布局檔案設定(多選模式設定):
<ListView android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="multipleChoice"/>
- 代碼設定:
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
選擇
ListView多選狀態是記錄到ListView控制項中,由其父類AbsListView實現。
列表Item最外層需要實現Checkable介面,比如CheckBox、CheckedTextView等控制項。
如果需要使用容器類控制項比如LinearLayout,可以重寫控制項,實現Checkable介面。
比如:
public class CheckableLinearLayout extends LinearLayout implements Checkable { private boolean mChecked = false; public CheckableLinearLayout(Context context) { super(context); } public CheckableLinearLayout(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public CheckableLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public void toggle() { setChecked(!mChecked); } @Override public boolean isChecked() { return mChecked; } @Override public void setChecked(boolean checked) { if (mChecked != checked) { mChecked = checked; refreshDrawableState(); for (int i = 0, len = getChildCount(); i < len; i++) { View child = getChildAt(i); if(child instanceof Checkable){ ((Checkable) child).setChecked(checked); } } } }}
擷取選擇資料
擷取到最終選擇結果為選中項索引集合,是一個SparseBooleanArray,記錄了操作過的item選擇狀態(如果選中item再取消同樣會記錄,狀態為false)。
SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
Android ListView多選模式