Android 在网格视图中使用多选模式
我正在创建用于查看图像的应用程序。因此,我决定在网格视图中对图片实施多选删除。我正在使用SetMultichoiceModelListener方法。一切正常,但我有一个问题…我无法在onDestroyActionMode方法中关闭上下文菜单。我总是遇到这样的异常:Android 在网格视图中使用多选模式,android,image,multichoiceitems,Android,Image,Multichoiceitems,我正在创建用于查看图像的应用程序。因此,我决定在网格视图中对图片实施多选删除。我正在使用SetMultichoiceModelListener方法。一切正常,但我有一个问题…我无法在onDestroyActionMode方法中关闭上下文菜单。我总是遇到这样的异常: java.lang.StackOverflowError at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.on
java.lang.StackOverflowError
at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
at android.support.v7.internal.view.SupportActionModeWrapper$CallbackWrapper.onDestroyActionMode(SupportActionModeWrapper.java:174)
at android.support.v7.app.AppCompatDelegateImplV7$ActionModeCallbackWrapperV7.onDestroyActionMode(AppCompatDelegateImplV7.java:1656)
at android.support.v7.internal.app.WindowDecorActionBar$ActionModeImpl.finish(WindowDecorActionBar.java:972)
at android.support.v7.internal.view.SupportActionModeWrapper.finish(SupportActionModeWrapper.java:78)
at com.example.vasylpaliy.mediaview.ImageList$1.onDestroyActionMode(ImageList.java:91)
at android.widget.AbsListView$MultiChoiceModeWrapper.onDestroyActionMode(AbsListView.java:6604)
at com.android.internal.policy.impl.PhoneWindow$DecorView$ActionModeCallbackWrapper.onDestroyActionMode(PhoneWindow.java:3048)
以下是代码:
view.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
private boolean isDeleted;
private ArrayList<String> imageItems;
{
imageItems=new ArrayList<String>();
isDeleted=false;
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
imageItems.add(imagePaths.get(position));
mode.setTitle("Selected:" + Integer.toString(view.getCheckedItemCount()));
imageAdapter.setCheckMark(position);
imageAdapter.notifyDataSetChanged();
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.multiple_audio, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId())
{
case R.id.multiple_audio_select_all:
{
imageItems=imagePaths;
for(int i=0;i<imageItems.size();i++)
view.setItemChecked(i,true);
break;
}
case R.id.multiple_audio_deleting:
{
deleteItems(imageItems);
isDeleted=true;
onDestroyActionMode(mode);
break;
}
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
if(mode!=null)
mode.finish();
}
});
finish将导致调用onDestroyActionMode,但不会将模式设置为null
因此,您所需要的是:
@Override
public void onDestroyActionMode(ActionMode mode) {
// nothing here ;)
}
还要注意,如果您想在此处完成操作模式:
case R.id.multiple_audio_deleting:
{
deleteItems(imageItems);
isDeleted=true;
onDestroyActionMode(mode);
break;
}
将其更改为:
case R.id.multiple_audio_deleting:
{
deleteItems(imageItems);
isDeleted=true;
mode.finish();
break;
}
我认为StackOverflower错误是由onActionItemClicked和onDestroyActionMode的实现引起的: 每次执行mode.finish时;在onDestroyActionMode中,框架将再次精确调用此方法,因此您正在创建一种无限循环 根据中的示例,特别是关于在ListView或GridView中启用批处理上下文操作的部分,您应该更改两件事: 一,。在onActionItemClicked的实现中,调用
mode.finish();
而不是onDestroyActionMode
二,。在OnDestroyAction模式下,不需要调用finish。您可以将此方法重写为
…拆下驾驶室后,对活动进行任何必要的更新。默认情况下,取消选择/取消选中所选项目