我有 ListView,其中包含 2 种类型的数据。只有在长按 1 种类型时,我才想启动动作模式。
这就是我启用动作模式的方式。
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(multiChoiceModeListener);
如何禁用第二种视图类型的操作模式。
我有 ListView,其中包含 2 种类型的数据。只有在长按 1 种类型时,我才想启动动作模式。
这就是我启用动作模式的方式。
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(multiChoiceModeListener);
如何禁用第二种视图类型的操作模式。
以下对我有用(用于AbsListView.MultiChoiceModeListener
回调):
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position,
long id, boolean checked)
{
Item item = mAdapter.getItem(position);
if (!item.checkable && checked) {
// Uncheck the item
mListView.setItemChecked(position, false);
return;
}
// the rest of the usual logic
// ...
}
基本上,如果不应该选中的项目被选中,我们取消选中它。
这是我的解决方案:
public class DeviceExclListView extends ListView{
private ActionMode mAm;
private boolean mActionModeStarted;
public DeviceExclListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public DeviceExclListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DeviceExclListView(Context context) {
super(context);
}
@Override
public ActionMode startActionMode(Callback callback) {
return mAm = super.startActionMode(callback);
}
@Override
public boolean performItemClick(View view, int position, long id) {
Object item = getItemAtPosition(position);
if(item instanceof DeviceItem && mActionModeStarted){
return true;
}else{
return super.performItemClick(view, position, id);
}
}
@Override
public void setItemChecked(int position, boolean value) {
Object item = getItemAtPosition(position);
if(item instanceof DeviceItem){
mAm.finish();
}else{
super.setItemChecked(position, value);
}
}
public boolean isActionModeStarted() {
return mActionModeStarted;
}
public void setActionModeStarted(boolean mActionModeStarted) {
this.mActionModeStarted = mActionModeStarted;
}
}
setActionModeStarted 由 MultiChoiceModeListenerCallback 设置。因此,当我长按 DeviceItem 动作模式时会立即关闭,并且在动作模式下无法检查。