【Kotlin/Android Studio】SimpleOnItemTouchListenerの使い方!RecyclerViewでタップイベントを実装する方法
この記事からわかること
- Android Studio/KotlinでRecyclerViewにタップイベントを実装する方法
- SimpleOnItemTouchListenerの使い方
- onInterceptTouchEventメソッド内の記述方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
参考文献:公式リファレンス:SimpleOnItemTouchListener
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
RecyclerViewでタップイベント
AndroidのRecyclerViewではリストアイテムをタップした際に任意の処理を実行するイベントを追加することが可能です。
それを実現させるのがSimpleOnItemTouchListener
クラスです。このクラスはリストアイテムをタップした際にコールバックメソッドが呼び出され、任意の処理を実行させる仕組みを提供しています。
public class RecyclerView.SimpleOnItemTouchListener implements RecyclerView.OnItemTouchListener
実装の流れ
実装方法は少しややこしいので流れと方法を1つずつ見ながら実装していきたいと思います。とりあえずタップ時に要素の値を表示するようにしていきます。
- SimpleOnItemTouchListenerを継承したクラスの作成
- コールバックメソッド内を実装
- Adapter側にアイテム取得メソッドを用意
SimpleOnItemTouchListenerを継承したクラスの作成
RecyclerViewにタップイベントを追加するにはSimpleOnItemTouchListener
クラスを継承させます。クラス名は何でも良いですがここではItemTouchListener
クラスを用意しておきます。
class ItemTouchListener : RecyclerView.SimpleOnItemTouchListener() {
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
// この中にタップされた時の処理を記述していく
}
}
コールバックメソッド内(onInterceptTouchEvent)を実装
続いてonInterceptTouchEvent
メソッド内からタップされた要素番号などを取得し、アイテム情報を取得、そこから実行したい処理などを記述します。
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
// タッチイベントの処理
if (e.action == MotionEvent.ACTION_DOWN) {
// タッチされた位置のViewを取得
val childView: View? = rv.findChildViewUnder(e.x, e.y)
if (childView != null) {
// 要素番号を取得
val position = rv.getChildAdapterPosition(childView)
if (position != RecyclerView.NO_POSITION) {
val adapter = rv.adapter
if (adapter is MyListAdapter) {
val tappedItem: String? = adapter.getItemAtPosition(position)
if (tappedItem != null) {
Toast.makeText(rv.context, tappedItem.toString(), Toast.LENGTH_LONG).show()
}
}
}
}
}
return false // 通常のタッチイベント処理を維持
}
onInterceptTouchEvent
の引数rv
のgetChildAdapterPosition
からタップされたリストアイテムインデックスを参照できます。少し順番が逆になりますが次でアダプター側(今回はMyListAdapter)のgetItemAtPosition
メソッドを用意します。
Adapter側にアイテム取得メソッドを用意
Adapterクラス側にアイテム取得用のメソッドを用意します。ここでは引数として受け取ったインデックス番号を元にデータソースからアイテムを取得させます。
public fun getItemAtPosition(position: Int) : String? {
if (position < 0 || position >= _myList.size) {
return null
}
val item = _myList[position]
return item
}
RecyclerViewとの紐付け
RecyclerView
と紐づけるためには以下のように記述します。
val itemTouchListener = ItemTouchListener()
recyclerView.addOnItemTouchListener(itemTouchListener)
これでアイテムをタップした際にアイテムのデータを取得し表示させることができるようになります。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。