android 能自动选择的listview,Android ListView多选模式
ListView使用多選模式好處
交互與數據分離,在多選狀態下不需要修改數據源,在最后確定的時候獲取選擇索引來確定選擇的數據。
ListView模式
CHOICE_MODE_NONE:普通模式;
CHOICE_MODE_SINGLE:單選模式;
CHOICE_MODE_MULTIPLE:多選模式;
CHOICE_MODE_MULTIPLE_MODAL:多選模式(與ActionMode配合使用)。
CHOICE_MODE_MULTIPLE 與 CHOICE_MODE_MULTIPLE_MODAL 區別:
前者能夠同時響應ListView Item點擊事件,與Item選擇事件;
后者在未進入ActionMode模式下響應Item點擊事件,不響應Item選擇事件。在進入ActionMode模式后不響應Item點擊事件,響應Item選擇事件。
同時后者如果Item長按能夠自動進入到ActionMode模式(也可以使用 ListView.setItemChecked(0,true)來選擇一項Item進入ActionMode模式),當所有Item全部取消選擇后,自動退出ActionMode模式。
CHOICE_MODE_MULTIPLE_MODAL使用方式:
listView = (ListView) findViewById(R.id.list_view);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new ListView.MultiChoiceModeListener());
設置方式
XML布局文件設置(多選模式設置):
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();
API
// 清除選中
public void clearChoices();
// 根據索引判斷是否選中
public boolean isItemChecked(int position);
// 獲取選中數量
public int getCheckedItemCount();
// 根據索引設置選中狀態
public void setItemChecked(int position, boolean value);
注意
如果ListView Item內有按鈕會搶Item點擊事件,解決方法為在Item根布局增加
android:descendantFocusability="blocksDescendants"
ActionMode監聽回調有兩種ActionMode.Callback和MultiChoiceModeListener,后者繼承自前者,并新增一個item選擇與取消選擇的回調方法,但是此方法只在CHOICE_MODE_MULTIPLE_MODAL模式下有效,所以MultiChoiceModeListener監聽只適用于CHOICE_MODE_MULTIPLE_MODAL模式。
ListView如果使用CHOICE_MODE_MULTIPLE_MODAL模式,可以自動進入ActionMode模式,使用setMultiChoiceModeListener(MultiChoiceModeListener listener)設置監聽回調。
總結
以上是生活随笔為你收集整理的android 能自动选择的listview,Android ListView多选模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 阿里云 maven,An
- 下一篇: android调用百度活体检测接口,C#