3

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

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

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

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

你有解决方案吗 ?谢谢你的帮助。

4

3 回答 3

2

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

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

但我在这个答案https://stackoverflow.com/a/30604299/2489474中找到了可行的解决方案。它使用反射来调用 NavigationView 的演示者的 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();
    }
}

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

于 2015-06-21T19:58:49.630 回答
1

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

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

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

于 2015-06-16T10:07:43.157 回答
1

@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() 但菜单没有更新!

于 2015-06-16T10:20:18.283 回答