Android 已激活的BackGoUndicator因重新加载而丢失

Android 已激活的BackGoUndicator因重新加载而丢失,android,gridview,universal-image-loader,multichoiceitems,Android,Gridview,Universal Image Loader,Multichoiceitems,我使用GridView和UIL来显示一些图像。我还实现了在ListView或GridView中启用批上下文操作时给出的选择示例。 上下文操作栏显示良好,我可以更新标题等,但activatedBackgroundIndicator丢失 当我通过longpress选择一个项目时,该项目最初会高亮显示。然后重新加载整个GridView,指示器丢失。我添加到选择中的每个其他项目也不会高亮显示。我不知道1为什么我的多媒体资料会重新加载,2为什么指示灯没有显示 有什么想法吗?下面是我的代码的一部分,它几乎是

我使用GridView和UIL来显示一些图像。我还实现了在ListView或GridView中启用批上下文操作时给出的选择示例。 上下文操作栏显示良好,我可以更新标题等,但activatedBackgroundIndicator丢失

当我通过longpress选择一个项目时,该项目最初会高亮显示。然后重新加载整个GridView,指示器丢失。我添加到选择中的每个其他项目也不会高亮显示。我不知道1为什么我的多媒体资料会重新加载,2为什么指示灯没有显示

有什么想法吗?下面是我的代码的一部分,它几乎是示例中的存根:

画廊片段:

网格项的XML:

当我调用ActionMode.finish或关闭CAB时,库也会重新加载

//编辑:当我删除对UIL的displayImage的调用时,我可以选择项目。E请参见选择-选择本身以两种方式工作。但是,当驾驶室被抽出或移除时,整个东西会重新加载,选择指示器也会消失。 除了上面的代码之外,我的图库片段看起来很像


//edit2:未修复它,因为我的代码中已经有它。

表示列表项的类需要一个字段,该字段将指示该项已选中:

 boolean checked;

 public void setChecked(boolean checked) {
   this.checked = checked;
 }

 public booelan isChecked() {
   return this.checked;
 }
然后更新CAB回调,如下所示:

@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
     actionMode.setTitle(""+grid.getCheckedItemCount());       
    ((YourItemType)yourGridAdapter.getItemAtPosition(position)).setChecked(checked);
     yourGridAdapter.notifyDataSetChanged();
}

@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
    actionMode.getMenuInflater().inflate(R.menu.image_detail, menu);
    yourGridAdapter.setSelectionMode(true);
    yourGridAdapter.notifyDataSetChanged();
    return true;
}

@Override
public void onDestroyActionMode(ActionMode actionMode) {
    yourGridAdapter.setSelectionMode(false);
    yourGridAdapter.clearAllCheckedItems();
    yourGridAdapter.notifyDataSetChanged();
}
并在网格的适配器中添加以下内容:

public void setSelectionMode(boolean selectionOn ){
    this.selectionOn = selectionOn ;
}

public void clearAllCheckedItems() {
    for(YourItemType item: yourItemsList) {
        item.setChecked(false);
     }
}
在getViewadd中添加以下内容:

convertView.setBackgroundyourItemTypeInstance.isChecked&&selectionOn?
YourDrawableIndicatingHattItemIschecked:yourDefaultListItemDrawableIndicator实际上一切正常,但由于加载的图像视图填充了整个区域,它只是覆盖了背景指示器

我通过在GridView项目中添加另一个布局(用作选择指示器)修复了这个问题。在onItemCheckedStateChanged中,我根据checked设置可见性


我希望这个答案能帮助那些和我一样呆板的人:

谢谢,这很好,但我的问题是,当驾驶室被绘制或移除时,我的整个画廊会重新加载,这也会移除背景。但是没有对ImageAdapter.notifyDataSetChanged或任何类似的调用。@m02ph3u5您有onCreateActionMode和onDestroyActionMode,因此您可以自己调用notifyDataSetChanged。也许你应该尝试另一个图像加载库——PicassoI不想调用notifyDataSetChanged——它似乎被调用是因为所有图像都会重新加载。我所要做的就是A在cab出现时防止重新加载所有图像,B保持选择指示器。@m02ph3u5似乎cab出现时会导致布局刷新。例如,您可以:将栅格视图放置在驾驶室下方。因此,当它出现时,布局不会重建。告诉你的操作栏覆盖你的视图-不要出现在上面。在你的主题中添加这个:true C检查你的图像是否可以缓存。我想问题是加载的图像位于背景之上,因此inidcator不可见。我会尝试设置一些自定义边框或类似的东西。。。
 boolean checked;

 public void setChecked(boolean checked) {
   this.checked = checked;
 }

 public booelan isChecked() {
   return this.checked;
 }
@Override
public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
     actionMode.setTitle(""+grid.getCheckedItemCount());       
    ((YourItemType)yourGridAdapter.getItemAtPosition(position)).setChecked(checked);
     yourGridAdapter.notifyDataSetChanged();
}

@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
    actionMode.getMenuInflater().inflate(R.menu.image_detail, menu);
    yourGridAdapter.setSelectionMode(true);
    yourGridAdapter.notifyDataSetChanged();
    return true;
}

@Override
public void onDestroyActionMode(ActionMode actionMode) {
    yourGridAdapter.setSelectionMode(false);
    yourGridAdapter.clearAllCheckedItems();
    yourGridAdapter.notifyDataSetChanged();
}
public void setSelectionMode(boolean selectionOn ){
    this.selectionOn = selectionOn ;
}

public void clearAllCheckedItems() {
    for(YourItemType item: yourItemsList) {
        item.setChecked(false);
     }
}