如何在新的NavigationView中使用notifyDataSetChanged?

3
我在最近的一个项目中使用了新的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);

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

1
菜单或菜单项没有“invalidate()”方法,因此应立即更新,确保您不在其他地方调用setVisible() - pskink
3个回答

2

更新:这个问题已经在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();
    }
}

P.S. 有趣的是,updateMenuView忽略了传递给它的值。


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

它对我有效。希望能帮到你。


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


如果用户未登录,则您希望隐藏与账户相关的所有项目。 - Moinkhan
如果用户未登录,则您希望隐藏与账户相关的所有项目吗?是的,我想这样做! - frenchdev20
所以,只需检查我的编辑答案。复制这两行并在设置方法中将其删除,它就可以工作了。 - Moinkhan
我已经在我的端上尝试了一下代码,使用true/false它可以工作。我认为你需要调试isLoggenIn变量。 - Moinkhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接