8

我正在尝试以编程方式将submenu项目添加到 . NavigationView我可以将项目添加到menu但不能添加到submenu

将项目添加到菜单工作

Menu menu = mNavigationView.getMenu();
menu.add(Menu.NONE, Menu.NONE, index, "Menu Item1");

但是将项目添加到子菜单不起作用

Menu menu = mNavigationView.getMenu();
SubMenu subMenu = menu.addSubMenu("Sub menu title");
subMenu.add(Menu.NONE, Menu.NONE, index, "SubMenu Item1");
4

2 回答 2

12

调用包含菜单项BaseAdapter.notifyDataSetChanged的底层证券的技巧。Adapter您可以使用反射来抓住ListView或只是循环NavigationView孩子,直到您到达它。

这不是最新的代码,据我所知,谷歌还没有将最新的更改推送到支​​持库,但本质上NavigationMenuPresenter.prepareMenuItems是在您调用BaseAdpater.notifyDataSetChanged.

但是如果您想查看最新的源代码,您可以通过 SDK Manager 下载它。选择Android MNC 的来源。然后导航到

yourAndroidSDK/sources/android-MNC/android/support/design/internal/NavigationMenuPresenter.java

来源

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    final Menu menu = mNavigationView.getMenu();
    for (int i = 0; i < 4; i++) {
        menu.add("Menu Item " + (i + 1));
    }
    final SubMenu subMenu = menu.addSubMenu("SubMenu Title");
    for (int i = 0; i < 2; i++) {
        subMenu.add("SubMenu Item " + (i + 1));
    }
    for (int i = 0, count = mNavigationView.getChildCount(); i < count; i++) {
        final View child = mNavigationView.getChildAt(i);
        if (child != null && child instanceof ListView) {
            final ListView menuView = (ListView) child;
            final HeaderViewListAdapter adapter = (HeaderViewListAdapter) menuView.getAdapter();
            final BaseAdapter wrapped = (BaseAdapter) adapter.getWrappedAdapter();
            wrapped.notifyDataSetChanged();
        }
    }

}

结果

结果

于 2015-06-03T02:58:50.507 回答
1

有人想出了一种通过反射和访问私有字段来做到这一点的方法。它不漂亮,但暂时可以。 https://stackoverflow.com/a/30604299/4232051

于 2015-06-03T02:24:50.370 回答