Go to list of users who liked
More than 5 years have passed since last update.
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()と組み合わせることで要素の位置がわかります。
例
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に一度コールバックしています。
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したほうがいいです。
Register as a new user and use Qiita more conveniently
- You get articles that match your needs
- You can efficiently read back useful information
- You can use dark theme