【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アイコン
をクリックします。接続済みのモバイルデバイスを選択すると、アプリが起動して数値のリストが表示されます。

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

まとめ
ListViewのスクロール方向の検出は、AbsListView.OnScrollListenerのonScroll()で先頭表示位置の増減を比較するだけで実現できます。RecyclerViewの場合も考え方は同じで、LinearLayoutManagerのfindFirstVisibleItemPosition()などを利用して同様の判定が可能です。ぜひ自分のアプリのUI改善に活用してみてください。
-
KotlinでAndroidのListViewに検索機能を実装する方法をわかりやすく解説
この記事では、Kotlinを使ってAndroidアプリのListView(リストビュー)に検索機能を実装する方法を、実際のサンプルコードとともに段階的に解説します。EditTextに入力されたテキストに応じて、リストの項目がリアルタイムで絞り込まれる仕組みを作ります。完成イメージ画面上部に検索用の入力欄(EditText)を配置し、その下に月名の一覧を表示するListViewを設置します。検索欄に文字を入力すると、一致する項目だけがリストに表示されるようになります。手順1:新規プロジェクトを作成するAndroid Studioを起動し、「File」→「New Project」を選択して、必要な
-
KotlinでAndroidのListViewにロングクリックリスナーを実装する方法を解説
KotlinでAndroidのListViewにロングクリックリスナーを実装する方法 この記事では、Kotlinを使用してAndroidのListViewにロングクリック(長押し)リスナーを実装する方法を、実際のコード例とともにステップごとに解説します。リストの項目を長押しした際にトーストメッセージを表示する、シンプルなサンプルアプリを作成します。 ステップ1:新しいプロジェクトを作成する Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成してください。 ステップ2:レイアウト