我有一个应用程序,它将项目添加到sqlite数据库并返回一个游标,然后该游标与一个名为StoreCursorAdapter的自定义CursorAdapter一起使用,以显示ListView中的项目。
有一个(全部删除)按钮作为optionsMenuItem。
我希望在ListView中没有可用的项目时隐藏此optionsMenuItem。
很抱歉我是新用户的链接,所以他们不允许我嵌入图片。 : - (
@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中没有完成这项工作。
答案 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()
。有两种方法可以做到这一点。一个更强大,另一个更快编码:
在执行数据库操作的代码之后添加invalidateOptionsMenu()
。
您将使用开始/停止回调来收听数据中的更改。如下所示:
@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?