2015-06-03 90 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

如何添加沒有標題的子菜單?它在那裏留下空間!可能是一個問題! –

相關問題