【问题标题】:activatedBackgoundIndicator lost due to reload由于重新加载而丢失了激活的BackgoundIndicator
【发布时间】:2023-03-30 13:40:01
【问题描述】:

我使用 GridView 和 Universal Image Loader (UIL) 来显示几个图像。我还实现了http://developer.android.com/guide/topics/ui/menus.html#CAB 中给出的选择 示例(在 ListView 或 GridView 中启用批处理上下文操作)。 上下文操作栏显示良好,我可以更新标题等,但 activatedBackgroundIndicator 丢失了。

当我通过长按选择一个项目时,该项目最初会突出显示。然后整个 GridView 重新加载并且指示器丢失。我添加到选择中的所有其他项目也不会突出显示。我不知道 #1 为什么我的图库会重新加载或 #2 为什么没有显示指示器。

有什么想法吗?这是我的代码的一部分(几乎是示例中的存根):

图库片段:

grid.setLongClickable(true);
grid.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
grid.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
    @Override
    public void onItemCheckedStateChanged(ActionMode actionMode, int position, long id, boolean checked) {
        actionMode.setTitle(""+grid.getCheckedItemCount());
    }

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

    @Override
    public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
        return false;
    }

    @Override
    public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
        switch (menuItem.getItemId()) {
            default:
                return false;
        }
    }

    @Override
    public void onDestroyActionMode(ActionMode actionMode) {

    }
});

网格项的 XML:

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="120dip"
    android:background="?android:attr/activatedBackgroundIndicator"
    >

    <ImageView ...

适配器

public class ImageAdapter extends BaseAdapter {
    ...
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...
        ImageLoader.getInstance().displayImage(...);
    }
}

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


//edit:当我删除对 UIL 的 displayImage() 的调用时,我可以很好地选择项目(即查看选择 - 选择本身确实可以通过任何方式工作)。但是,当 CAB 被绘制或移除时,整个东西会重新加载,并且选择指示器会消失。 除了上面的代码,我的 Gallery Fragment 看起来很像 this

//edit2:This 没有修复它(因为我的代码中已经有它)。

【问题讨论】:

  • 我猜问题是加载的图像放置在背景之上,因此指示器不可见。我会尝试设置一些自定义边框或类似的东西......

标签: android gridview universal-image-loader multichoiceitems


【解决方案1】:

您的代表列表项的类需要一个字段来指示该项目已被选中:

 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);
     }
}

getView()添加这个:

convertView.setBackground(yourItemTypeInstance.isChecked() && selectionOn ? yourDrawableIndicatingThatItemIsChecked : yourDefaultListItemDrawableIndicator )

【讨论】:

  • 谢谢,这很好,但我的问题是当 CAB 被绘制或移除时我的整个画廊会重新加载,这也会移除背景。但是没有调用 ImageAdapter.notifyDataSetChanged() 或类似的东西。
  • @m02ph3u5 你有onCreateActionMode()onDestroyActionMode(),所以你可以自己打电话给notifyDataSetChanged()。也许你应该尝试另一个图像加载库 - Picasso
  • 我不想打电话给notifyDataSetChanged() - 似乎是因为所有图像都重新加载而被调用。我想要的只是 A)在出租车出现时不重新加载所有图像,B)保持选择指示器。
  • @m02ph3u5 似乎当 CAB 出现时,它会导致布局刷新。您可以: A) 将您的网格视图放置在例如 CAB 下方。所以当它出现时 - 布局不会重建。 B)告诉您的操作栏覆盖您的视图 - 不出现在上方。将此添加到您的主题中:&lt;item name="android:windowActionBarOverlay"&gt;true&lt;/item&gt; &lt;item name="windowActionBarOverlay"&gt;true&lt;/item&gt; C) 检查您的图像是否可以缓存。
【解决方案2】:

实际上一切正常,但由于加载的 ImageView 填充了整个区域,它只是覆盖了背景指示器。

i通过将另一个布局添加到我的GridView项目中,该项目是“修复”的。在onItemCheckedStateChanged()内我根据checked设置可见性。

我希望这个答案能帮助和我一样笨的人:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2014-08-23
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2020-05-14
    相关资源
    最近更新 更多