大概有2种方式,1是用setMultiChocie方法,但是遗憾的是2.X版本不支持,最低版本要求是api11.
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public void onItemCheckedStateChanged(android.view.ActionMode mode, int position, long id, boolean checked) {
}
@Override
public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onPrepareActionMode(android.view.ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(android.view.ActionMode mode, MenuItem item) {
return false;
}
@Override
public void onDestroyActionMode(android.view.ActionMode mode) {
}
});
无奈用第2种方式:mActionMode,虽然稍微麻烦点儿。
下面就主要介绍mActionMode形式的用法。
首先,长按时启动actionMode
listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (mActionMode == null) {
mActionMode = startSupportActionMode(new MyActionModeCallback());
}
return true;
}
});
其次,自定义ActionMode.Callback类,并在创建的回调里加载contextual menu
private class MyActionModeCallback implements ActionMode.Callback {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
actionMode.getMenuInflater().inflate(R.menu.context_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) { list.get(position).setSelected(false);
adapter.notifyDataSetChanged();
mActionMode = null;
} }
然后,写listView的子项点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (mActionMode != null) {
LogCat.v(TAG + "position:" + position);
list.get(position).setSelected(!list.get(position).isSelected());
adapter.notifyDataSetChanged();
}
}
});
然后,在适配器 getView方法里根据bool设置背景颜色。
if (list.get(position).isSelected()) {
view.setBackgroundColor(context.getResources().getColor(R.color.blue_light));
} else {
view.setBackgroundColor(Color.TRANSPARENT);
}
关键步骤就是上面的这几步。
还有几点注意:
注册监听时要绑定适配器。
mActionMode = startSupportActionMode(new MyActionModeCallback());
start的时候是有返回值的,要给mActionMode值,我就是因为忘了,所以导致长按后的子项点击事件没有log而纠结半天。
先写这么多,后续的多选完成后的删除操作明天加上。