web-dev-qa-db-fra.com

Ajouter un ListView ou un RecyclerView à un nouveau NavigationView

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>
15
nabir

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.

18
Basant Singh

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

 example

17
redblood

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>
4
IsaiahJ

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>

1
Mahendran Candy