在平时的使用中,我们经常会用到ListView的多选功能,一般比较常见的方式是通过在itemView中加入一个checkBox来实现。其实ListView的API中提供了用于实现多选功能的相关接口。可以通过设置ListView的choiceMode
属性来实现listview
的item项在长按时激活多选的功能,再配合ListView.MultiChoiceModeListener
的回调实现多选。
下面具体来看一下实现方法。
1. 在布局中加入一个listview控件
然后在MainActivity中对这个listview进行初始化,下面是onCreate中的代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
mDatas = new ArrayList<>();
for (int i = 0; i < 30; i++) {
mDatas.add("Item " + i);
}
mAdapter = new MyAdapter(this, mDatas);
mMultiChoiceListener = new MultiChoiceListener();
mListView = (ListView) findViewById(R.id.lv);
mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(mMultiChoiceListener);
}
其中关键的代码是mListView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
mListView.setMultiChoiceModeListener(mMultiChoiceListener);
第一行是设置listview的选择模式,第二行是为listview设置一个多选时的回调事件。这个mMultiChoiceListener
是一个实现了AbsListView.MultiChoiceModeListener
接口的类。通过接口的名字就可以猜到这个一个在多选模式激活时候的回调,在这里我们可以处理多选时的逻辑。来看一下AbsListView.MultiChoiceModeListener
里提供的几个方法:
class MultiChoiceListener implements AbsListView.MultiChoiceModeListener {
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
Log.d(TAG, "onItemCheckedStateChanged");
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
Log.d(TAG, "onCreateActionMode");
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
Log.d(TAG, "onPrepareActionMode");
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Log.d(TAG, "onActionItemClicked");
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
Log.d(TAG, "onDestroyActionMode");
}
}
完成上述的代码后,当我们长按listview的item时通过Log日志可以看到onCreateActionMode
onPrepareActionMode
onItemCheckedStateChanged
这三个方法执行了,
并且这时候手机的主界面也有了变化:
可以看到在Toolbar上方又多出来了一条和Toolbar类似的东西(两个bar的位置问题后面会说到),这就是ListView的ActionMode模式。
而当我们点击左上角的箭头时,这个bar就会消失,并且会执行MultiChoiceListener
中的onDestroyActionMode
方法。
这就是一个完整的listview多选功能的激活和取消的过程,我们可以通过在MultiChoiceListener
类中编写相关的逻辑实现listview的多选。
2. 实现ActionMode 菜单并为其设置CustomView.
在res/menu文件夹中创建menu_multi_choice.xml文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:a