【问题标题】:Android: show/hide menuitem based on number of items in the ListViewAndroid:根据 ListView 中的项目数显示/隐藏菜单项
【发布时间】:2016-02-21 04:32:24
【问题描述】:

我的活动中有一个 ListView。我也有一个菜单,还有一个用于保存列表的菜单项。我想让它的行为类似于下面的伪代码:

if (myList.size() > 0) {
    menuitem.setVisible(true);
} else {
    menuitem.setVisible(false);
}

我希望“保存”菜单项仅在列表视图中至少有一项时显示。我也有一个自定义的 ArrayAdapter 实现,可以从那里进行此操作吗?或者有什么我可以使用的监听器?

感谢任何帮助!

编辑:

JDev 的答案就是解决方案。 我只更改了一件事:我将列表大小检查移至自定义 ArrayAdapter 中的 notifyDataSetChanged() 方法,现在它可以工作了!

     /**
     * {@inheritDoc}
     */
    @Override
    public void notifyDataSetChanged() {

        // Hide/show 'save' menuitem
        if (mListItems.size() > 0) {
           mListener.setMenuItemVisible(true);
        } else {
           mListener.setMenuItemVisible(false);
        }

        super.notifyDataSetChanged();
     }

【问题讨论】:

  • @AsfK 不是。我知道如何隐藏菜单项,但我不知道如何在我的 ListView 中没有项目时隐藏它,以及在至少一个项目已放入 ListView 时如何显示它。
  • 如果您使用自定义列表视图,您应该找到getCount() 方法,否则您可以知道您的列表\数组长度(\大小)。当您从列表视图中添加\删除项目时,只需使用您的代码。显示一些代码,在其中添加\删除项目...
  • @lkallas 你的问题解决了吗?
  • @JDev 是的,它工作得很好!我编辑了我的问题。你能告诉我是否 super.notifyDataSetChanged(); notifyDataSetChanged() 是否需要?无论如何都赞成并标记为答案。非常感谢!

标签: java android android-listview android-menu


【解决方案1】:

获得ListView 长度后。加invalidateOptionsMenu();拨打onCreateOptionsMenu()

检查ListView是否为空,

@Override 
public boolean onCreateOptionsMenu(Menu menu)
{ 
    ...
    MenuItem menuitem = menu.findItem(R.id.addAction);
    if (myList.size() > 0) {
        menuitem.setVisible(true);
    } else {
        menuitem.setVisible(false);
    }
}

如果您有任何疑问,请在下方评论。

【讨论】:

    【解决方案2】:

    在您的自定义数组适配器中,您可以执行以下操作:

    CustomArrayAdapter.java

    public interface MenuListener {
        void setMenuItemVisible(boolean state);
    }
    
    private MenuListener mListener;
    private Item[] mListItems; // The list of items that your adapter handles
    
    public void setMenuListener(MenuListener listener) {
        mListener = listener;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ListView listview = convertView.findViewById(R.id.yourListViewId);
        if (mListItems.size() > 0) {
            mListener.setMenuItemVisible(true);
        } else {
            mListener.setMenuItemVisible(false);
        }
    
    }
    

    Activity.java:

    public class Activity implements CustomArrayAdapter.MenuListener {
    
        private MenuItem menuItem; // The menu item that you wanna show/hide
    
        ....
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
    
            CustomArrayAdapter adapter = new CustomArrayAdapter(params...);
            adapter.setMenuListener(this);
            // Set listView adapter
        }
    
        @Override 
        public boolean onCreateOptionsMenu(Menu menu)
        { 
            menuItem = menu.findItem(R.id.menuItemId); // Save the menu item that you want to show/hide later
            ...
        }
    
        @Override
        public void setMenuItemVisible(boolean state) {
            menuItem.setVisible(state);
        }
    }
    

    【讨论】:

      【解决方案3】:

      您不必为这样简单的事情实现侦听器或其他复杂的方法。在您的活动中,只需添加一行(在您获取要传递给适配器的数组之后):

      menuitem.setVisible(array!= null && array.length() > 0 ? true: false);
      // array.length() / array.length / array.size() -- whichever is suitable
      

      编辑:如果您允许用户从列表中添加/删除,则忽略上面的单行。您可以简单地将 Activity 作为参数包含到适配器的构造函数中。在您的活动中,添加一个公共方法,例如:

      public void showHideMenuItem(int size) {
          menuitem.setVisible(size > 0 ? true: false);
      }
      

      在您的适配器中,从您允许添加/删除项目的任何位置调用上述方法:

      activity.showHideMenuItem(items.getCount());
      

      要初始设置菜单项的可见性,请调用:

      showHideMenuItem(0); // from your Activity's onCreate(), or
      activity.showHideMenuItem(0); // from your adapter's constructor
      

      如果您已经通过侦听器等解决了这个问题并且您对此感到满意,那没关系,如果没有必要,我个人不会使事情复杂化。我还希望通过适配器持有的数组大小与列表视图中的项目数来确定菜单项的可见性。

      【讨论】:

      • 但是在我的 Activity java 代码中我应该把这行放在哪里呢?当 listview 为空时,我需要 menuitem 不可见,并且一旦有东西它再次变得可见。当 ListView 的数据集发生更改时执行此操作似乎是合乎逻辑的。还是不行?
      • 用户能否在列表视图中添加/删除项目?
      • 是的!用户可以添加/删除。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      • 1970-01-01
      • 2015-04-05
      • 2011-11-11
      • 2019-10-22
      • 1970-01-01
      相关资源
      最近更新 更多