J'utilise le nouveau NavigationView de la révision 22.2.0 de la bibliothèque de prise en charge de Google. Cela fonctionne parfaitement bien pour générer un tiroir de navigation rempli à l'aide d'un menu res.
Je me demandais s'il était possible d'ajouter un ListView ou un RecyclerView au tiroir de navigation afin qu'il puisse être rempli à l'aide de mon code d'adaptateur personnalisé, ce qui permet une bien plus grande flexibilité que les ressources de menu.
Voici mon XML actuel:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/main_toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
app:headerLayout="@layout/navigation_drawer_header"
app:menu="@menu/menu_navigation_drawer" />
</Android.support.v4.widget.DrawerLayout>
Où est-ce que j'ajouterais ListView ou RecyclerView dans mon XML?
MODIFIER
Selon la suggestion de Basant, j'ai imbriqué un ListView dans le NavigationView. Vous perdez la possibilité de gonfler à partir d’un menu de résolution (pour autant que je sache), mais cela réussit ce que je veux qu’il fasse. L'en-tête XML est inchangé, il est simplement inclus dans XML.
Nouveau code:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/main_toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start">
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include
Android:id="@+id/navigation_drawer_header_include"
layout="@layout/navigation_drawer_header" />
<ListView
Android:id="@+id/navigation_drawer_list"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_below="@id/navigation_drawer_header_include"/>
</RelativeLayout>
</Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>
Vous pouvez simplement imbriquer la ListView
ou la RecyclerView
dans la NavigationView
.
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout
Android:id="@+id/drawer_layout"
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:context=".MainActivity">
<FrameLayout
Android:id="@+id/content_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/main_toolbar" />
</FrameLayout>
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"/>
<ListView
Android:id="@+id/menuList"
Android:layout_width="match_parent"
Android:layout_height="match_parent"/>
</Android.support.v4.widget.DrawerLayout>
REMARQUE: N'oubliez pas que si vous utilisez un ListView à l'intérieur, vous ne pouvez pas utiliser l'en-tête de NavigationView. Vous devrez utiliser la vue en-tête du ListView que vous ajoutez. N'oubliez pas de supprimer les champs app:menu
et app:header
.
Si vous souhaitez ajouter des vues dans NavigationView, vous pouvez procéder de la sorte. De cette façon, vous n’aurez aucune restriction à ajouter Header sur votre NavigtionView avec ListView.
<Android.support.v4.widget.DrawerLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/drawer_layout"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
<Android.support.design.widget.NavigationView
Android:id="@+id/nav_view"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="false"
>
<LinearLayout
Android:orientation="vertical"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<include layout="@layout/nav_header_main"
Android:id="@+id/my"
/>
<ListView
Android:layout_weight="7"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:id="@+id/list_view_inside_nav"></ListView>
</LinearLayout>
</Android.support.design.widget.NavigationView>
</Android.support.v4.widget.DrawerLayout>
Cela ressemble à quelque chose comme ça
En réponse au commentaire de Shubham
Cela ne fera pas défiler la vue en-tête comme le fait la vue Navigation.
Je l'ai résolu en plaçant la LinearLayout
dans une NestedScrollView
. Maintenant, il défile correctement avec l'en-tête.
<Android.support.v4.widget.NestedScrollView
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/nav_header_main" />
<Android.support.v7.widget.RecyclerView
Android:id="@+id/nav_list"
Android:layout_width="match_parent"
Android:layout_height="@dimen/weight_based_height"
Android:layout_weight="1"
Android:nestedScrollingEnabled="false"/>
</LinearLayout>
</Android.support.v4.widget.NestedScrollView>
Essayez de cette façon
<Android.support.design.widget.NavigationView
Android:id="@+id/navigation"
Android:layout_width="wrap_content"
Android:layout_height="match_parent"
Android:layout_gravity="start"
Android:fitsSystemWindows="true">
<LinearLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">
<include layout="@layout/nav_header" />
<ListView
Android:id="@+id/lst_menu_items"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:layout_weight="1" />
</LinearLayout>