Movatterモバイル変換


[0]ホーム

URL:


LoginSignup
59

Go to list of users who liked

57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RecyclerViewのアイテムクリック

Last updated atPosted at 2015-01-09

ViewHolderにClickListener実装させろ (http://stackoverflow.com/a/24933117) というのを見たけど
1要素のクリックなら1つのOnClickListenerで処理できるんじゃないの?というアプローチ。

RecyclerViewとRecyclerView.Adapterの結合

RecyclerView.Adapterには、以下のコールバックメソッドがあります。

onAttachedToRecyclerView(RecyclerView)
onDetachedFromRecyclerView(RecyclerView)

これらのコールバックによって、AdapterはどのRecyclerViewにattachされたのかがわかります。

RecyclerViewからpositionを取得する

RecyclerViewには、getChildAdapterPosition(view)というメソッドがあります。
このメソッドにViewを渡すと、そのViewのAdapter上のpositionが取得できます。

実装

View.OnClickListenerを1つ実装し、onCreateViewHolder()で、クリック可能にするすべてのアイテムViewにセットします。
処理的には、独自のリスナーを定義して、それにコールバックする処理を書けばいいです。

View.OnClickListenerのonClick()はクリックされたViewをくれるので、getChildAdapterPosition()と組み合わせることで要素の位置がわかります。

CustomRecyclerAdapter
publicclassCustomRecyclerAdapterextendsRecyclerView.Adapter<RecyclerView.ViewHolder>implementsView.OnClickListener{privatefinalList<Item>mList=newArrayList<>();privateRecyclerViewmRecycler;privateOnItemClickListenermListener;@OverridepublicvoidonAttachedToRecyclerView(RecyclerViewrecyclerView){super.onAttachedToRecyclerView(recyclerView);mRecycler=recyclerView;}@OverridepublicvoidonDetachedFromRecyclerView(RecyclerViewrecyclerView){super.onDetachedFromRecyclerView(recyclerView);mRecycler=null;}publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroupviewGroup,intviewType){Viewview=mInflater.inflate();view.setOnClickListener(this);RecyclerView.ViewHolderholder=newRecyclerView.ViewHolder(view);returnholder;}publicvoidsetOnItemClickListener(OnItemClickListenerlistener){mListener=listener;}@OverridepublicvoidonClick(Viewview){if(mRecycler==null){return;}if(mListener!=null){intposition=mRecycler.getChildAdapterPosition(view);Itemitem=mList.get(position);mListener.onItemClick(this,position,item);}}publicstaticinterfaceOnItemClickListener{publicvoidonItemClick(CustomRecyclerAdapteradapter,intposition,Itemitem);}}

ちなみに、この実装では要素中の部分的なViewのクリックには対応できないです。
その場合は、素直にViewHolderにListenerを実装させましょう。

僕は、ViewHolderにAdapterを持たせて、ViewHolderからAdapterに一度コールバックしています。

CustomRecyclerAdapter
publicclassCustomRecyclerAdapterextendsRecyclerView.Adapter<Holder>{// …privatevoidonButtonClick(intposition){// アイテムのボタンクリック}staticclassHolderextendsRecyclerView.ViewHolderimplementsOnClickListener{privateCustomRecyclerAdaptermAdapter;publicHolder(ViewitemView,CustomRecyclerAdapteradapter){super(itemView);mAdapter=adapter;itemView.findViewById(R.id.button).setOnClickListener(this);}publicvoidonClick(Viewview){mAdapter.onButtonClick(getAdapterPosition());}}

実際はHolderにOnClickListener実装させるのではなく、ButterKnifeでbindしたほうがいいです。

59

Go to list of users who liked

57
0

Go to list of comments

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
59

Go to list of users who liked

57

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?


[8]ページ先頭

©2009-2025 Movatter.jp