Android ListView多選模式
阿新 • • 發佈:2018-04-09
ListViewListView使用多選模式好處
交互與數據分離,在多選狀態下不需要修改數據源,在最後確定的時候獲取選擇索引來確定選擇的數據。
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多選模式