3

NavigationView最近のプロジェクトの 1 つで新しいものを使用しています。ただし、更新データに問題があります。

以前はListViewDrawerLayoutデータを変更する必要があるときに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

@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 に答える