web-dev-qa-db-ja.com

ListViewまたはRecyclerViewを新しいNavigationViewに追加します

Googleの サポートライブラリ のリビジョン22.2.0の新しい NavigationView を使用しています。メニューresを使用して入力されたナビゲーションドロワーを生成するのに完全に機能します。

ListViewまたはRecyclerViewをナビゲーションドロワーに追加して、カスタムアダプターコードを使用してデータを入力できるようにすると、メニューリソースよりもはるかに高い柔軟性が得られるのではないかと思いました。

現在のXMLは次のとおりです。

<?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>

XMLのどこにListViewまたはRecyclerViewを追加しますか?

[〜#〜] edit [〜#〜]

Basantの提案に従って、私はListViewをNavigationViewにネストしました。あなたはメニュー解像度から膨らませる能力を失います(私が知る限り)が、それは私がやりたいことで成功します。ヘッダーXMLは変更されず、XMLに含まれています。

新しいコード:

<?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>
19
nabir

ListView内にRecyclerViewまたは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>

注: ListViewを使用すると、NavigationViewのヘッダーを使用できないことに注意してください。追加するListViewのヘッダービューを使用する必要があります。 app:menuおよびapp:headerフィールドを削除することを忘れないでください。

19
Basant Singh

NavigationView内にビューを追加する場合、次のようなことができます。これにより、ListViewを使用してNavigtionViewにヘッダーを追加する際の制限がなくなります。

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

こんな感じ

example

19
redblood

Shubhamのコメントに応えて

ナビゲーションビューのようにヘッダービューはスクロールしません

LinearLayoutNestedScrollViewの中に入れることで解決しました。これで、ヘッダーとともに適切にスクロールします。

<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

この方法を試してください

<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