我想在ListView中没有项目时删除optionMenu(显示emptyView)?

时间:2016-10-28 19:02:54

标签: java android listview android-optionsmenu

我有一个应用程序,它将项目添加到sqlite数据库并返回一个游标,然后该游标与一个名为StoreCursorAdapter的自定义CursorAdapter一起使用,以显示ListView中的项目。

有一个(全部删除)按钮作为optionsMenuItem。

我希望在ListView中没有可用的项目时隐藏此optionsMenuItem。

InventoryActivty

EditorActivity

很抱歉我是新用户的链接,所以他们不允许我嵌入图片。 : - (

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_inventory);

    //Declare the views
    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    ListView list = (ListView) findViewById(R.id.list);
    emptyView = findViewById(R.id.empty_view);

    //Set the screen to be shown when there are no list items
    list.setEmptyView(emptyView);

    //StoreCursorAdapter is a custom CursorAdapter
    mAdapter = new StoreCursorAdapter(this, null);
    list.setAdapter(mAdapter);
}

@Override
protected void onStart() {
    super.onStart();
    invalidateOptionsMenu();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu options from the res/menu/menu_inventory.xml file.
    // This adds menu items to the app bar.
    getMenuInflater().inflate(R.menu.menu_inventory, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // User clicked on a menu option in the app bar overflow menu
    showDeleteConfirmationDialog();
    return super.onOptionsItemSelected(item);
}

我试过

1 - emptyView.visibilty()== View.INVISBLE

2 - list.getAdapter == null

但他们没有工作

什么声明会起作用?!

@Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        super.onPrepareOptionsMenu(menu);
        if (//what statement) {
            MenuItem menuItem = menu.findItem(R.id.action_delete_all);
            menuItem.setVisible(false);
        }
        return true;
    }

注意:

从EditorActivity返回后,OnStart()被调用

注意:

在我的应用中,我可以删除其他活动中的单个项目,因此添加了invalidateOptionsMenu();在onOptionsItemSelected中没有完成这项工作。

2 个答案:

答案 0 :(得分:1)

放入onPrepareOptionsMenu的正确条件是:

menuItem.setVisible(!mAdapter.isEmpty());

这是ListView使用的相同比较管理空视图(减去空检查)(https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/AdapterView.java#747

但我相信这里还有另一个问题,就是在showDeleteConfirmationDialog()期间活动开始后数据正在发生变化。这意味着您必须在数据更改时调用invalidateOptionsMenu()。有两种方法可以做到这一点。一个更强大,另一个更快编码:

  1. 更快地编码(但不是很好/干净):
  2. 在执行数据库操作的代码之后添加invalidateOptionsMenu()

    1. 更健壮/干净
    2. 您将使用开始/停止回调来收听数据中的更改。如下所示:

      @Override protected void onStart(){
        super.onStart();
        invalidateOptionsMenu();
        mAdapter.registerDataSetObserver(dataObserver);
      }
      
      @Override protected void onStop(){
        mAdapter.unregisterDataSetObserver(dataObserver);
        super.onStop();
      }
      
      private final DataSetObserver dataObserver = new DataSetObserver(){
        @Override public void onChanged(){
          invalidateOptionsMenu();
        }
        @Override public void onInvalidated(){
          invalidateOptionsMenu();
        }
      };
      

      上面的所有代码都是用心输入的,可能是拼写错误,但这可能是您以后可以在代码中修复的想法和拼写错误。

答案 1 :(得分:0)

如果你没有任何菜单项显示,为什么你要膨胀一个,如果你不膨胀你不会。

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    return false;
}

除非您需要根据活动的当前状态动态删除菜单选项,否则这可能会有所帮助How do you remove an inflated menu/items from the new Lollipop Toolbar?