【Kotlin/Android Studio】SimpleOnItemTouchListenerの使い方!RecyclerViewでタップイベントを実装する方法

この記事からわかること

  • Android Studio/KotlinRecyclerViewタップイベント実装する方法
  • SimpleOnItemTouchListener使い方
  • onInterceptTouchEventメソッド内の記述方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

参考文献:公式リファレンス:SimpleOnItemTouchListener

環境

RecyclerViewでタップイベント

AndroidのRecyclerViewではリストアイテムをタップした際に任意の処理を実行するイベントを追加することが可能です。

【Kotlin/Android Studio】SimpleOnItemTouchListenerの使い方!RecyclerViewでタップイベントを実装する方法

それを実現させるのがSimpleOnItemTouchListenerクラスです。このクラスはリストアイテムをタップした際にコールバックメソッドが呼び出され、任意の処理を実行させる仕組みを提供しています。


public class RecyclerView.SimpleOnItemTouchListener implements RecyclerView.OnItemTouchListener

実装の流れ

実装方法は少しややこしいので流れと方法を1つずつ見ながら実装していきたいと思います。とりあえずタップ時に要素の値を表示するようにしていきます。

  1. SimpleOnItemTouchListenerを継承したクラスの作成
  2. コールバックメソッド内を実装
  3. 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の引数rvgetChildAdapterPositionからタップされたリストアイテムインデックスを参照できます。少し順番が逆になりますが次でアダプター側(今回は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)

これでアイテムをタップした際にアイテムのデータを取得し表示させることができるようになります。

【Kotlin/Android Studio】SimpleOnItemTouchListenerの使い方!RecyclerViewでタップイベントを実装する方法

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index