【问题标题】:How to use notifyDataSetChanged with the new NavigationView?如何在新的 NavigationView 中使用 notifyDataSetChanged?
【发布时间】:2015-09-01 01:05:28
【问题描述】:

我在最近的一个项目中使用了新的NavigationView。但是我有更新数据的问题。

以前,我在DrawerLayout 中使用了ListView,当我需要更改数据时,我调用了适配器的notifyDataSetChanged() 方法。

目前NavigationView 没有notifyDataSetChanged() 方法,当我想更新菜单上的某个项目时,什么也没有发生,例如:

 Menu menuAccount = navigationView.getMenu().findItem(R.id.drawer_item_account).getSubMenu();
 menuAccount.findItem(R.id.drawer_item_login).setVisible(!isLoggedIn);

你有解决办法吗?感谢您的帮助。

【问题讨论】:

  • Menu 或 MenuItem 没有“invalidate()”方法,因此应立即更新,确保不要在其他地方调用 setVisible()

标签: android material-design android-design-library navigationview


【解决方案1】:

更新: 这已在 v23.0.0 中修复,因此您无需自己做任何事情,只需更新您的依赖项即可。从这个答案得到:https://stackoverflow.com/a/32181083/2489474

旧解决方案(只是看看它有多愚蠢):

但我在这个答案https://stackoverflow.com/a/30604299/2489474 中找到了可行的解决方案。它使用反射来调用 NavigationView 的 Presenter 的 updateMenuView(boolean)。

出于我的目的,我已经修改了答案中的代码。还要检查答案中的一种方法,然后选择哪种方法更适合您。

//HACK
private void updateNavigationView() {
    try {
        Field presenterField = NavigationView.class.getDeclaredField("mPresenter");
        presenterField.setAccessible(true);
        ((NavigationMenuPresenter) presenterField.get(navigationView_)).updateMenuView(false);
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

附:有趣的是 updateMenuView 忽略了赋予它的值。

【讨论】:

    【解决方案2】:

    @Moinkhan 感谢您的帮助,但对我不起作用。这是我的 menu_drawer.xml

    <group
        android:checkableBehavior="single"
        android:id="@+id/group1">
    
        <item
            android:id="@+id/drawer_item_publications_list"
            android:icon="@drawable/ic_drawer_publications_24dp"
            android:title="@string/drawer_menu_item_publications" />
    </group>
    
    <group android:id="@+id/drawer_group_account">
    
        <item
            android:title="@string/drawer_menu_sub_item_account"
            android:id="@+id/drawer_item_account">
    
            <menu>
                <item
                    android:icon="@drawable/ic_drawer_login_24dp"
                    android:id="@+id/drawer_item_login"
                    android:title="@string/drawer_menu_item_login" />
    
                <group
                    android:id="@+id/group_actions_user">
    
                    <item
                        android:icon="@drawable/ic_drawer_add_publication_24dp"
                        android:id="@+id/drawer_item_add_publication"
                        android:title="@string/drawer_menu_item_add_publication" />
    
                    <item
                        android:icon="@drawable/ic_drawer_my_publications_24dp"
                        android:id="@+id/drawer_item_my_publications"
                        android:title="@string/drawer_menu_item_my_publications" />
    
                    <item
                        android:icon="@drawable/ic_drawer_edit_profil_24dp"
                        android:id="@+id/drawer_item_edit_profil"
                        android:title="@string/drawer_menu_item_edit_profil" />
    
                    <item
                        android:icon="@drawable/ic_drawer_delete_account_24dp"
                        android:id="@+id/drawer_item_delete_account"
                        android:title="@string/drawer_menu_item_delete_account" />
    
                    <item
                        android:icon="@drawable/ic_drawer_logout_24dp"
                        android:id="@+id/drawer_item_logout"
                        android:title="@string/drawer_menu_item_logout" />
    
                </group>
    
            </menu>
        </item>
    </group>
    

    还有我更新 NavigationView 的方法

    private void setUpNavigationDrawer()
    {
        boolean isLoggedIn = sessionManager.isLoggedIn();
    
        navigationView.getMenu().findItem(R.id.drawer_item_account).getSubMenu().findItem(R.id.drawer_item_login).setVisible(!isLoggedIn);
        navigationView.getMenu().findItem(R.id.drawer_item_account).getSubMenu().setGroupVisible(R.id.group_actions_user, isLoggedIn);
    }
    

    经过一些操作,我调用了 setUpNavigationDrawer() 但菜单没有更新!

    【讨论】:

    • 如果用户未登录,那么您想隐藏所有与帐户相关的项目。?
    • "如果用户未登录,那么您想隐藏所有与帐户相关的项目。?"是的,我想要这个!
    • 因此,只需检查我编辑的答案。复制这两行并在您的设置方法中将其删除。它会工作..
    • 我已经用真/假尝试了我的代码,它正在工作。我认为您必须调试 isLoggenIn 变量..
    【解决方案3】:

    不要引用组,然后从该组中找到一个项目并设置它的可见性尝试像这样直接引用该项目 ...

    navView.getMenu().findItem(R.id.drawer_item_login).setVisible(!isLoggedin);
    navView.getMenu().findItem(R.id.drawer_item_account).getSubMenu().setGroupVisible(R.id.group_actions_user, !isLoggedin);
    

    它对我有用。希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多