全画面スクロールの中でListViewを個別スクロールさせる方法(Android Studio Kotlin)

,

Androidのアプリ作成で、レイアウトのxmlコードに於いてListViewタグを含む画面全体をScrollViewタグで挟んで全画面をスクロール出来るようにした場合に、ListView内部のスクロールだけを行なおうとすると全画面がスクロールしてしまい、ListView内部をスクロール出来ない場合があります。その場合の対処方法に関して記します。

1.現象

ListViewを含む画面全体をScrollViewで挟んで全画面のスクロールをさせるようにするとListView内部のスクロールだけ行おうとしても全画面がスクロールしてしまう。(下記動画)

2.開発環境等

開発ツールバージョン: Android Studio Giraffe 2022.3.1 Path3
使用言語: Kotlin

3.対処方法

レイアウトのxmlコード(app→res→layout→activity_main.xml)のListViewの部分に
android:nestedScrollingEnabled=”true”
を追加する

4.対処方法の例

Designモードを使用して下記の様に部品を配置した場合の例を示します。(ConstraintLayout使用)

5.修正前のレイアウトのxmlコード

修正前のレイアウトのxmlコード(app→res→layout→activity_main.xml)を以下に示します。

2行目~7行目、76行目:
全画面をスクロールさせるためのScrollViewのタグ

14行目~22行目:
ListViewに関する部分。このままの記述ではListViewだけのスクロールが出来ません。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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:fillViewport="true">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/ListView1"
        android:layout_width="358dp"
        android:layout_height="338dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="32dp"
        android:entries="@array/items"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="63dp"
        android:text="Button1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ListView1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button1" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button2" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button3" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button4" />

</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>         

6.文字列定義のxmlコード (app→res→values→strings.xml)

ListViewのitem等を定義している、文字列定義のxml (app→res→values→strings.xml)のコードを以下に示します。

<resources>
    <string name="app_name">スクロールテスト</string>
    <string-array name="items">
        <item>項目1</item>
        <item>項目2</item>
        <item>項目3</item>
        <item>項目4</item>
        <item>項目5</item>
        <item>項目6</item>
        <item>項目7</item>
        <item>項目8</item>
        <item>項目9</item>
        <item>項目10</item>
        <item>項目11</item>
        <item>項目12</item>
    </string-array>
</resources>

7.修正後のレイアウトのxmlコード

修正後のレイアウトのxmlコード(app→res→layout→activity_main.xml)を以下に示します。

21行目:
全画面スクロールの中でListViewを個別にスクロールさせるために
android:nestedScrollingEnabled=”true”
を挿入しました。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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:fillViewport="true">

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/ListView1"
        android:layout_width="358dp"
        android:layout_height="338dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="32dp"
        android:entries="@array/items"
        android:nestedScrollingEnabled="true"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="63dp"
        android:text="Button1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/ListView1" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button1" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button3"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button2" />

    <Button
        android:id="@+id/button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button3" />

    <Button
        android:id="@+id/button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="32dp"
        android:layout_marginTop="80dp"
        android:text="Button5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button4" />

</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>      

8.修正後の動作画面動画

修正後の画面の動作を以下の動画に示します。画面全体のスクロールとListView単独のスクロールが可能です。


PAGE TOP