我想在 ListView 中没有项目时删除 optionMenu(显示为空视图)?
I want to remove the optionMenu when there are no items in ListView (emptyView is shown)?
我有一个将项目添加到 sqlite 数据库和 returns 游标的应用程序,然后将此游标与名为 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;
}
注:
OnStart() 在我从 EditorActivity 返回后被调用
注:
在我的应用程序中,我可以从另一个 activity 中删除单个项目,因此添加 invalidateOptionsMenu();在 onOptionsItemSelected 中不会完成这项工作。
如果你没有任何菜单项可以显示,你为什么要给一个充气,如果你不充气你就不会。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
除非您需要根据 activity 的当前状态动态删除菜单选项,否则这可能会有所帮助 How do you remove an inflated menu/items from the new Lollipop Toolbar?
放入 onPrepareOptionsMenu
的正确条件是:
menuItem.setVisible(!mAdapter.isEmpty());
这与 ListView 使用的相同比较管理空视图(减去 null 检查)(https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/AdapterView.java#747)
但我认为这里还有另一个问题,即在 activity 开始后 showDeleteConfirmationDialog()
期间数据正在发生变化。这意味着您必须在数据更改时调用 invalidateOptionsMenu()
。有两种方法可以做到。一个更健壮,另一个编码更快:
- 编码速度更快(但不是很 good/clean):
在执行DB操作的代码后添加invalidateOptionsMenu()
- 更多robust/clean
您将使用 start/stop 回调来监听数据的变化。类似于以下内容:
@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();
}
};
上面的所有代码都是用心输入的,可能会有拼写错误,但这是您稍后可以在代码中修复的想法和拼写错误。
我有一个将项目添加到 sqlite 数据库和 returns 游标的应用程序,然后将此游标与名为 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;
}
注:
OnStart() 在我从 EditorActivity 返回后被调用
注:
在我的应用程序中,我可以从另一个 activity 中删除单个项目,因此添加 invalidateOptionsMenu();在 onOptionsItemSelected 中不会完成这项工作。
如果你没有任何菜单项可以显示,你为什么要给一个充气,如果你不充气你就不会。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return false;
}
除非您需要根据 activity 的当前状态动态删除菜单选项,否则这可能会有所帮助 How do you remove an inflated menu/items from the new Lollipop Toolbar?
放入 onPrepareOptionsMenu
的正确条件是:
menuItem.setVisible(!mAdapter.isEmpty());
这与 ListView 使用的相同比较管理空视图(减去 null 检查)(https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/AdapterView.java#747)
但我认为这里还有另一个问题,即在 activity 开始后 showDeleteConfirmationDialog()
期间数据正在发生变化。这意味着您必须在数据更改时调用 invalidateOptionsMenu()
。有两种方法可以做到。一个更健壮,另一个编码更快:
- 编码速度更快(但不是很 good/clean):
在执行DB操作的代码后添加invalidateOptionsMenu()
- 更多robust/clean
您将使用 start/stop 回调来监听数据的变化。类似于以下内容:
@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();
}
};
上面的所有代码都是用心输入的,可能会有拼写错误,但这是您稍后可以在代码中修复的想法和拼写错误。