RecyclerViewでアイテムのクリックイベントを取得し、処理を実行する方法を紹介します。
目次
アイテムのクリックイベントを取得する方法
RecyclerViewの前身のListViewは、OnItemClickListenerでアイテムのクリックイベントが取得できました。
しかし、RecyclerViewにOnItemClickListenerはありません。
RecyclerViewでアイテムのクリックイベントを取得したければ、プログラマ側でリスナーを実装する必要があります。
では、「どのようにリスナーを実装すればよいのか?」です。
全てのアイテムは個別のViewが割り当てられます。この一つ一つのViewへOnClickListenerを登録し、その中から新たに実装したリスナーをコールバックすれば実現できそうです。

コールバックが2重になり、その分のオーバーヘッド(余分な関数の呼出)が発生しますが妥協することにします。
アイテムのViewはアダプターが作成しているので、作成のタイミングでOnClickListenerを登録します。
OnItemClickListenerの例
ショートクリックのイベントを取得し、処理を実行します。
リスナーの実装
新たにOnItemClickListener(インターフェース)を実装し、コールバックonClick( )でonItemClick( )を呼び出します。
class ArrayAdapter(var items: Array<String>)
    : RecyclerView.Adapter<ArrayAdapter.ArrayViewHolder>() {
    ...
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
            : ArrayViewHolder {
        val _view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item, parent, false)
        val _holder = ArrayViewHolder(_view)
        _view.setOnClickListener{       // リスナーの実装
            itemClickListener?.onItemClick(_holder)
        }
        return _holder   // ViewHolderを返す
    }
    ...
    // ----- クリックリスナー ----------------------------------------
    var itemClickListener: OnItemClickListener? = null
    interface OnItemClickListener {
        fun onItemClick(holder: ArrayViewHolder)
    }
}
※onClick( )はSAM形式で記述されています。
イベントで処理を実行
新たに実装したリスナーOnItemClickListenerの登録は、RecyclerViewではなく、Adapterに対して行うことになります。
        val _adapter = ArrayAdapter(_items)
        _adapter.itemClickListener = object : ArrayAdapter.OnItemClickListener{
            override fun onItemClick(holder: ArrayAdapter.ArrayViewHolder) {
                //
                // ここにクリックイベント時の処理を記述
                //
                // 例:Toastを表示
                val _position = holder.adapterPosition  // アイテムのポジションを取得
                val _mesg = holder.mesg.text    // mesgはエレメントのView(TextView)
                Toast.makeText(
                        this@MainActivity,
                        "Click Pos=${_position} Mesg=\"${_mesg}\"",
                        Toast.LENGTH_LONG
                ).show()
            }
        }

OnItemLongClickListenerの例
ロングクリックのイベントを取得し、処理を実行します。
リスナーの実装
新たにOnItemLongClickListener(インターフェース)を実装し、コールバックonLongClick( )でonItemLongClick( )を呼び出します。
class ArrayAdapter(var items: Array<String>)
    : RecyclerView.Adapter<ArrayAdapter.ArrayViewHolder>() {
    ...
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)
            : ArrayViewHolder {
        val _view = LayoutInflater.from(parent.context)
                .inflate(R.layout.item, parent, false)
        val _holder = ArrayViewHolder(_view)
        _view.setOnLongClickListener{   // リスナーの実装
            itemLongClickListener?.onItemLongClick(_holder)?:true
        }
        return _holder   // ViewHolderを返す
    }
    ...
    // ----- クリックリスナー ----------------------------------------
    var itemLongClickListener: OnItemLongClickListener? = null
    interface OnItemLongClickListener {
        fun onItemLongClick(holder: ArrayViewHolder): Boolean
    }
}
※onLongClick( )はSAM形式で記述されています。
イベントで処理を実行
新たに実装したリスナーOnItemLongClickListenerの登録は、RecyclerViewではなく、Adapterに対して行うことになります。
        val _adapter = ArrayAdapter(_items)
        _adapter.itemLongClickListener = object : ArrayAdapter.OnItemLongClickListener{
            override fun onItemLongClick(holder: ArrayAdapter.ArrayViewHolder): Boolean {
                //
                // ここにクリックイベント時の処理を記述
                //
                // 例:Toastを表示
                val _position = holder.adapterPosition  // アイテムのポジションを取得
                val _mesg = holder.mesg.text    // mesgはエレメントのView(TextView)
                Toast.makeText(
                        this@MainActivity,
                        "LongClick Pos=${_position} Mesg=\"${_mesg}\"",
                        Toast.LENGTH_LONG
                ).show()
                return true
            }
        }

関連記事:
