RecyclerView:アイテムのクリックイベント取得と処理実行

投稿日:  更新日:

RecyclerViewでアイテムのクリックイベントを取得し、処理を実行する方法を紹介します。

スポンサーリンク

アイテムのクリックイベントを取得する方法

RecyclerViewの前身のListViewは、OnItemClickListenerでアイテムのクリックイベントが取得できました。

しかし、RecyclerViewにOnItemClickListenerはありません。

RecyclerViewでアイテムのクリックイベントを取得したければ、プログラマ側でリスナーを実装する必要があります。

では、「どのようにリスナーを実装すればよいのか?」です。

全てのアイテムは個別のViewが割り当てられます。この一つ一つのViewへOnClickListenerを登録し、その中から新たに実装したリスナーをコールバックすれば実現できそうです。

OnItemClickListener

コールバックが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()
            }
        }

OnItemClickの例

スポンサーリンク

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

OnItemLongClickの例

スポンサーリンク

関連記事:

RecyclerViewは子Viewを並べて表示するコンテナタイプ(ConstraintLayoutと同じ)のViewです。 複数のデータをスクリーン上に一覧表示したい時、例えば電話帳のような「氏名+住所+電話番号」の一覧を表示する場合などに最適です。 アプリを開発していると一覧表示したいデータが多いことに気付きます。 なのでRecyclerViewはとても重要で重宝するViewです。 しかし、思い通りの表示を行わせるためのテクニックが多すぎて、使いこなしが難しいです。 今まで調べたテクニックを忘れないように、整理して書き残そうと思います。 今回は基本の「RecyclerViewの実装」です。 ...
RecyclerViewはアイテムのレイアウトをアイテム毎に変更できます。その時に使う値がViewTypeです。 ViewTypeでアイテムのレイアウトを変更する方法を紹介します。 ...
RecyclerViewは表示が変更される(アイテムの更新、スクロール)時、アイテムのViewをリサイクル(再生利用)します。 これにより余分なViewの作成が行われなくなり、メモリーの節約とパフォーマンスの向上が望めます。 リサイクルはCachedViewsとRecyclerPoolという2つのキャッシュで行われます。 このキャッシュを使ったリサイクルの動作を調べたので紹介します。 ...
RecyclerViewのリサイクル動作で使われるキャッシュは、サイズを大きくすれば多くのViewHolderが保持できます。その分、多くのメモリを消費します。 ViewHolderを多く保持できたとしても、サイクル動作で効率よく使われなければ、メモリの浪費です。 キャッシュのサイズはRecyclerViewの使われ方よって適切なサイズがあります。 そのため、RecyclerViewはキャッシュのサイズを変更できるようになっています。 ...
RecyclerViewはアイテムを一覧表示してくれます。 ただ一覧表示するだけではなく、「追加・削除・移動・切り替え」といったアイテムの表示を効率よく変更する仕組み持っています。 今回はこの仕組みを使ったアイテムの変更方法を紹介します。 ...
RecyclerViewのリサイクル動作で使われるキャッシュは、サイズを大きくすれば多くのViewHolderが保持できます。その分、多くのメモリを消費します。 ViewHolderを多く保持できたとしても、サイクル動作で効率よく使われなければ、メモリの浪費です。 キャッシュのサイズはRecyclerViewの使われ方よって適切なサイズがあります。 そのため、RecyclerViewはキャッシュのサイズを変更できるようになっています。 ...
RecyclerViewが空(アイテムが無い)の時、EmptyViewを表示する実装を行ったので紹介します。 ...
RecyclerView上のアイテムを選択する方法を紹介します。 外部ライブラリー(AndroidX)で提供されるrecyclerview-selection APIを用いた方法です。 ...
RecyclerViewはListView(RecyclerViewの前身)の時に存在していたChoiceModeがありません。 同様な機能が欲しければプログラマ側で実装しなければなりません。 RecyclerView.AdapterをカスタマイズしてChoiceModeを実装してみたので紹介します。 ...
RecyclerViewはアイテムへ装飾を付けることが出来るようになっています。 装飾とは、例えばアイテムの区切り線などです。 今回はアイテムへ装飾を付ける方法を紹介します。 ...
RecyclerViewに表示しきれなかったアイテムはスクロールを行うことで表示されるようになっています。 スクロールは「外部入力(指でスクリーン上をタッチしてスライド)によるスクロール」の他に、「プログラムによるスクロール」をすることも出来ます。 今回はこのアイテムのスクロールについてまとめてみました。 ...
RecyclerViewはアイテムをスクロールさせて隠れたアイテムを表示できます。 スクロールを止める位置は任意です。 任意であるがゆえに、止めた位置によってはアイテムの一部が欠けてしまうこともあります。 携帯端末の画面は狭いので、効率よくコンテンツの表示を行いたいとアプリ開発者は考えます。 アイテムの一部が欠けてしまうことは、効率が良いとは言えません。 このような問題を解決するために、アイテムのスナップをRecyclerViewへ追加できます。 アイテムのスナップを追加する方法を紹介します。 ...
RecyclerViewでアイテムの変更(Change/Insert/Move/Remove)を行うと、変更される様子がアニメーション化されています。 これはデフォルトでアイテムの変更アニメーションが組み込まれているためです。 デフォルトは単純なアニメーションですが、「ある」と「ない」の違いは歴然で、アニメーションのある方が高価なアプリケーションに見えます。 GUI(Graphical User Interface)が主体の携帯端末にとって、利用者に対するアプリの見せ方は重要です。高価に見えた方が使ってもらえる可能性が高くなります。 上記のことから、アプリの機能に関係なくても、ちょっとした動きをアニメーション化するメリットがあります。 2回にわたりアイテムの変更アニメーションについてまとめてみました。 アイテムの変更アニメーション(DefaultItemAnimator、デフォルト) アイテムの変更アニメーション(SimpleItemAnimatorの継承、カスタム) 今回は第1回目「ItemAnimator、デフォルト」編です。デフォルト変更アニメーションの動作について説明します。 ...
RecyclerViewでアイテムの変更(Change/Insert/Move/Remove)を行うと、変更される様子がアニメーション化されています。 これはデフォルトでアイテムの変更アニメーションが組み込まれているためです。 デフォルトは単純なアニメーションですが、「ある」と「ない」の違いは歴然で、アニメーションのある方が高価なアプリケーションに見えます。 GUI(Graphical User Interface)が主体の携帯端末にとって、利用者に対するアプリの見せ方は重要です。高価に見えた方が使ってもらえる可能性が高くなります。 上記のことから、アプリの機能に関係なくても、ちょっとした動きをアニメーション化するメリットがあります。 2回にわたりアイテムの変更アニメーションについてまとめてみました。 アイテムの変更アニメーション(DefaultItemAnimator、デフォルト) アイテムの変更アニメーション(SimpleItemAnimatorの継承、カスタム) 今回は第2回目「SimpleItemAnimatorの継承、カスタム」編です。カスタム変更アニメーションの作り方を説明 ...
RecyclerViewへアイテムが表示されるとき、アニメーションはありません。。一瞬で表示されて終わりです。 「RecyclerViewへアイテムが表示される」ことを、ここでは「アイテムの出現」と言い表すことにします。 このアイテムの出現にアニメーションを付ける方法を紹介します。 アイテムの出現をアニメーションで演出することで、RecyclerViewに表示したい内容が際立つと思います。 ...
スポンサーリンク