您好,登錄后才能下訂單哦!
這篇“Android中如何實(shí)現(xiàn)ListView多選模式”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Android中如何實(shí)現(xiàn)ListView多選模式”文章吧。
交互與數(shù)據(jù)分離,在多選狀態(tài)下不需要修改數(shù)據(jù)源,在最后確定的時候獲取選擇索引來確定選擇的數(shù)據(jù)。
CHOICE_MODE_NONE
:普通模式;
CHOICE_MODE_SINGLE
:單選模式;
CHOICE_MODE_MULTIPLE
:多選模式;
CHOICE_MODE_MULTIPLE_MODAL
:多選模式(與ActionMode配合使用)。
CHOICE_MODE_MULTIPLE 與 CHOICE_MODE_MULTIPLE_MODAL 區(qū)別:
前者能夠同時響應(yīng)ListView Item點(diǎn)擊事件,與Item選擇事件;
后者在未進(jìn)入ActionMode模式下響應(yīng)Item點(diǎn)擊事件,不響應(yīng)Item選擇事件。在進(jìn)入ActionMode模式后不響應(yīng)Item點(diǎn)擊事件,響應(yīng)Item選擇事件。
同時后者如果Item長按能夠自動進(jìn)入到ActionMode模式(也可以使用 ListView.setItemChecked(0,true)來選擇一項(xiàng)Item進(jìn)入ActionMode模式),當(dāng)所有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布局文件設(shè)置(多選模式設(shè)置):
<ListView android:layout_width="match_parent" android:layout_height="match_parent" android:choiceMode="multipleChoice"/>
代碼設(shè)置:listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
ListView多選狀態(tài)是記錄到ListView控件中,由其父類AbsListView實(shí)現(xiàn)。
列表Item最外層需要實(shí)現(xiàn)Checkable
接口,比如CheckBox、CheckedTextView等控件。
如果需要使用容器類控件比如LinearLayout
,可以重寫控件,實(shí)現(xiàn)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); } } } } }
獲取到最終選擇結(jié)果為選中項(xiàng)索引集合,是一個SparseBooleanArray
,記錄了操作過的item選擇狀態(tài)(如果選中item再取消同樣會記錄,狀態(tài)為false)。SparseBooleanArray checkedItemPositions = listView.getCheckedItemPositions();
// 清除選中
public void clearChoices();
// 根據(jù)索引判斷是否選中
public boolean isItemChecked(int position);
// 獲取選中數(shù)量
public int getCheckedItemCount();
// 根據(jù)索引設(shè)置選中狀態(tài)
public void setItemChecked(int position, boolean value);
如果ListView Item內(nèi)有按鈕會搶Item點(diǎn)擊事件,解決方法為在Item根布局增加android:descendantFocusability="blocksDescendants"
ActionMode監(jiān)聽回調(diào)有兩種ActionMode.Callback和MultiChoiceModeListener,后者繼承自前者,并新增一個item選擇與取消選擇的回調(diào)方法,但是此方法只在CHOICE_MODE_MULTIPLE_MODAL模式下有效,所以MultiChoiceModeListener監(jiān)聽只適用于CHOICE_MODE_MULTIPLE_MODAL模式。
ListView如果使用CHOICE_MODE_MULTIPLE_MODAL模式,可以自動進(jìn)入ActionMode模式,使用setMultiChoiceModeListener(MultiChoiceModeListener listener)
設(shè)置監(jiān)聽回調(diào)。
以上就是關(guān)于“Android中如何實(shí)現(xiàn)ListView多選模式”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。