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
}
}

関連記事:
