有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我想在ListView中没有项目时删除选项菜单(显示emptyView)?

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

选项菜单项中有一个(全部删除)按钮

当列表视图中没有可用的项目时,我想隐藏此选项菜单项

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-空视图。Visibility()=视图。隐形的

2.列表。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;
    }

注:

OnStart()在我从EditorActivity返回后被调用

注:

在我的应用程序中,我可以从另一个活动中删除单个项目,以便添加InvalidateOptions功能表();在OnOptions中,ItemSelected不会执行此任务


共 (2) 个答案

  1. # 1 楼答案

    如果你没有任何菜单项可以显示,为什么你要给它充气,如果你不充气,你就不会

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

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

  2. # 2 楼答案

    放入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. 更快地编写代码(但不是很好/干净):

    在执行DB操作的代码后面添加invalidateOptionsMenu()

    1. 更坚固/干净

    您将使用开始/停止回调来监听数据中的更改。如下所示:

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

    上面所有的代码都是用心输入的,可能会有打字错误,但这就是你以后可以在代码中修复的想法和错误