Android
 Computer >> コンピューター >  >> プログラミング >> Android

【Kotlin】AndroidのListViewでスクロールの上下方向を検出する方法

はじめに

この記事では、Kotlinを使用してAndroidのListViewでスクロールアップ(上方向)スクロールダウン(下方向)を検出する方法を解説します。

仕組みはシンプルです。ListViewにOnScrollListenerを設定し、「画面の先頭に表示されている項目の位置(firstVisibleItem)」が前回からどう変化したかを比較します。値が増えていれば下へスクロール、減っていれば上へスクロールしたと判定できます。

実装手順

ステップ1:新規プロジェクトを作成する

Android Studioで「File → New Project」を選択し、必要な情報を入力して新しいプロジェクトを作成します。

ステップ2:レイアウトファイル(res/layout/activity_main.xml)

res/layout/activity_main.xmlに以下のコードを追加します。画面いっぱいにListViewを配置するシンプルな構成です。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="8dp"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

ステップ3:アクティビティ(src/MainActivity.kt)

src/MainActivity.ktに以下のコードを追加します。setOnScrollListener()の中で、前回の先頭表示位置(lastFirstVisibleItem)と現在の先頭表示位置(firstVisibleItem)を比較し、スクロール方向に応じてToastメッセージを表示しています。

import android.os.Bundle
import android.widget.*
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    private lateinit var listView: ListView
    private var numbers = arrayOf(
        "1", "2", "3", "4", "5",
        "6", "7", "8", "9", "10",
        "11", "12", "13", "14", "15",
        "16", "17", "18", "19", "20",
        "21", "22", "23", "24", "25"
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        title = "KotlinApp"

        val adapter: ArrayAdapter<*> = ArrayAdapter(
            this,
            R.layout.support_simple_spinner_dropdown_item, numbers
        )
        listView = findViewById(R.id.listView)
        listView.adapter = adapter

        listView.setOnScrollListener(object : AbsListView.OnScrollListener {
            private var lastFirstVisibleItem = 0

            override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {}

            override fun onScroll(
                view: AbsListView,
                firstVisibleItem: Int,
                visibleItemCount: Int,
                totalItemCount: Int
            ) {
                // 先頭表示位置が増えた → 下へスクロール
                if (lastFirstVisibleItem < firstVisibleItem) {
                    Toast.makeText(
                        applicationContext, "Scrolling down the listView",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                // 先頭表示位置が減った → 上へスクロール
                if (lastFirstVisibleItem > firstVisibleItem) {
                    Toast.makeText(
                        applicationContext, "Scrolling up the listView",
                        Toast.LENGTH_SHORT
                    ).show()
                }
                lastFirstVisibleItem = firstVisibleItem
            }
        })
    }
}

ポイント:この判定方法はスクロール中に何度も呼ばれるonScroll()内で位置の差分を見るだけなので、追加のライブラリや複雑なジェスチャー処理は不要です。ツールバーやヘッダーの表示・非表示切り替えなど、さまざまなUI制御に応用できます。

ステップ4:マニフェスト(androidManifest.xml)

androidManifest.xmlに以下のコードを追加します。特別なパーミッションは不要です。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.q11">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

アプリを実行して動作を確認する

それではアプリを実行してみましょう。実機のAndroid端末をあらかじめPCに接続しておいてください。

Android Studioでプロジェクトのアクティビティファイルを開き、ツールバーのRunアイコン【Kotlin】AndroidのListViewでスクロールの上下方向を検出する方法をクリックします。接続済みのモバイルデバイスを選択すると、アプリが起動して数値のリストが表示されます。

【Kotlin】AndroidのListViewでスクロールの上下方向を検出する方法

リストを指で上下にスワイプしてみてください。下にスクロールすると「Scrolling down the listView」、上にスクロールすると「Scrolling up the listView」というトーストメッセージが画面下部に表示されれば成功です。

【Kotlin】AndroidのListViewでスクロールの上下方向を検出する方法

まとめ

ListViewのスクロール方向の検出は、AbsListView.OnScrollListeneronScroll()で先頭表示位置の増減を比較するだけで実現できます。RecyclerViewの場合も考え方は同じで、LinearLayoutManagerfindFirstVisibleItemPosition()などを利用して同様の判定が可能です。ぜひ自分のアプリのUI改善に活用してみてください。

  1. KotlinでAndroidのListViewに検索機能を実装する方法をわかりやすく解説

    この記事では、Kotlinを使ってAndroidアプリのListView(リストビュー)に検索機能を実装する方法を、実際のサンプルコードとともに段階的に解説します。EditTextに入力されたテキストに応じて、リストの項目がリアルタイムで絞り込まれる仕組みを作ります。完成イメージ画面上部に検索用の入力欄(EditText)を配置し、その下に月名の一覧を表示するListViewを設置します。検索欄に文字を入力すると、一致する項目だけがリストに表示されるようになります。手順1:新規プロジェクトを作成するAndroid Studioを起動し、「File」→「New Project」を選択して、必要な

  2. KotlinでAndroidのListViewにロングクリックリスナーを実装する方法を解説

    KotlinでAndroidのListViewにロングクリックリスナーを実装する方法 この記事では、Kotlinを使用してAndroidのListViewにロングクリック(長押し)リスナーを実装する方法を、実際のコード例とともにステップごとに解説します。リストの項目を長押しした際にトーストメッセージを表示する、シンプルなサンプルアプリを作成します。 ステップ1:新しいプロジェクトを作成する Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。 ステップ2:レイアウト