2015-06-03 386 views
8

我试图以编程方式将submenu项添加到NavigationView。我可以将项目添加到menu但不为submenu如何以编程方式将子菜单项添加到NavigationView而不是菜单xml

添加项目到菜单工程

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"); 

回答

12

在底层Adapter上调用BaseAdapter.notifyDataSetChanged的技巧,其中包含菜单项。您可以使用反射来抓住ListView或只是循环穿过NavigationView儿童,直到达到它。

这不是最新的代码,因为我知道Google并没有将最新的更改推送到支​​持库,但当您拨打BaseAdpater.notifyDataSetChanged时,基本上会调用NavigationMenuPresenter.prepareMenuItems

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

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

sources

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

} 

结果

results

+1

由于它的工作原理。但它应该比获取列表视图和刷新更简单。 – Libin

+1

是的,我同意。我想像这样的事情会随着新设计库的进展而变得更加平滑。很高兴它适合你虽然。 – adneal

+1

如何添加没有标题的子菜单?它在那里留下空间!可能是一个问题! –

相关问题