そのため、私のメイン アクティビティでは、NavigationView をセットアップしました。これには、「My Projects」というタイトルのサブメニューと「Shared Projects」というタイトルのサブメニューの合計 2 つが含まれています。アクティビティが作成されると、サーバーからプロジェクトを取得し、次の方法でドロワーに追加するように設定しました。
Menu menu = navigationView.getMenu();
Menu myProjects = menu.findItem(R.id.myProjects).getSubMenu();
Menu sharedProjects = menu.findItem(R.id.sharedProjects).getSubMenu();
for (int i = 0; i < myProjectList.size(); i++) {
myProjects.add(myProjectList.get(i).getTitle()).setIcon(R.drawable.ic_keyboard_arrow_right_black_24dp);
}
for (int i=0; i<sharedProjectList.size(); i++) {
sharedProjects.add(sharedProjectList.get(i).getTitle()).setIcon(R.drawable.ic_keyboard_arrow_right_black_24dp);
}
MenuItem mi = menu.getItem(menu.size() - 1);
mi.setTitle(mi.getTitle());
これは問題なく機能し、探していた出力が得られます。ただし、この機能を拡張して、ユーザーがアプリで新しいプロジェクトを作成した場合、アクティビティ全体を再起動することなくドロワー内で更新する必要があるようにしたいと考えています。Android 開発者向けドキュメントでは、notifyDataSetChanged() や、ビューを更新できる並べ替えなどのメソッドが強調表示されていません。
私のデータは、myProjectList と sharedProjectList の 2 つの arrayList で構成されています。リストは、アクティビティ全体で公開され、ユーザーが行った変更で非同期に更新されるプロジェクト オブジェクトで構成されます。
EDIT2:解決済み誰かがこの質問に同様の回答を投稿しているようです:
Googleの新しいNavigationViewでMenuItemをSubMenuに追加するには?
これを onResume に追加し、元のリストを更新すると完全に機能します。
final View child = navigationView.getChildAt(0);
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();
}