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 } }
関連記事: