activatedBackgoundIndicator 由于重新加载而丢失
activatedBackgoundIndicator lost due to reload
我使用 GridView 和 Universal Image Loader (UIL) to display a couple images. I've also implemented the example for Selection given in http://developer.android.com/guide/topics/ui/menus.html#CAB(在 ListView 或 GridView 中启用批处理上下文操作)。
上下文操作栏显示良好,我可以更新标题等,但 activatedBackgroundIndicator 丢失了。
当我 select 通过长按某个项目时,该项目最初会突出显示。然后整个 GridView 重新加载,指示器丢失。我添加到 selection 的所有其他项目也不会突出显示。我不知道 #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.
时,图库也会重新加载
//编辑:当我删除对 UIL 的 displayImage() 的调用时,我可以 select 项目就好了(即看到 selection - selection 本身也可以方法)。但是当 CAB 被绘制或移除时,整个东西会重新加载并且 selection 指示器消失。
除了上面的代码,我的 Gallery Fragment 看起来很像 this
//edit2:This 没有修复它(因为我的代码中已经有了)。
您的 class 表示列表项需要一个字段来指示该项目已选中:
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 )
实际上一切正常,但由于加载的 ImageView 填满了整个区域,它只是覆盖了背景指示器。
我 "fixed" 通过向我的 GridView 项添加另一个 Layout 作为选择指示器。在 onItemCheckedStateChanged()
内,我根据 checked
.
设置可见性
我希望这个回答能帮助到和我一样学***的人:)
我使用 GridView 和 Universal Image Loader (UIL) to display a couple images. I've also implemented the example for Selection given in http://developer.android.com/guide/topics/ui/menus.html#CAB(在 ListView 或 GridView 中启用批处理上下文操作)。 上下文操作栏显示良好,我可以更新标题等,但 activatedBackgroundIndicator 丢失了。
当我 select 通过长按某个项目时,该项目最初会突出显示。然后整个 GridView 重新加载,指示器丢失。我添加到 selection 的所有其他项目也不会突出显示。我不知道 #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.
时,图库也会重新加载//编辑:当我删除对 UIL 的 displayImage() 的调用时,我可以 select 项目就好了(即看到 selection - selection 本身也可以方法)。但是当 CAB 被绘制或移除时,整个东西会重新加载并且 selection 指示器消失。 除了上面的代码,我的 Gallery Fragment 看起来很像 this
//edit2:This 没有修复它(因为我的代码中已经有了)。
您的 class 表示列表项需要一个字段来指示该项目已选中:
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 )
实际上一切正常,但由于加载的 ImageView 填满了整个区域,它只是覆盖了背景指示器。
我 "fixed" 通过向我的 GridView 项添加另一个 Layout 作为选择指示器。在 onItemCheckedStateChanged()
内,我根据 checked
.
我希望这个回答能帮助到和我一样学***的人:)