1. ホーム
  2. android

[解決済み] RecyclerViewでクリックされた項目とその位置を取得する

2022-08-26 22:31:15

質問

私の ListViewRecyclerView で、リストが表示されるのはいいのですが、クリックされた項目とその位置を取得する方法を知りたいと思います。 OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id) で使用している ListView .

アイデアありがとうございます!

どのように解決するのですか?

リンクを元に なぜRecyclerViewはonItemClickListener()を持っていないのですか? とRecyclerViewはどのようにListviewと違うのですか? というリンクと@Duncanの一般的なアイデアに基づいて、ここに私の解決策を示します。

  • 1つのインターフェイスを定義する RecyclerViewClickListener へのメッセージの受け渡しに使用します。 Activity / Fragment :

      public interface RecyclerViewClickListener {
          public void recyclerViewListClicked(View v, int position);
      }
    
    
  • Activity / Fragment を実装し、さらにリスナーをアダプタに渡します。

      @Override
      public void recyclerViewListClicked(View v, int position){... ...}
    
      //set up adapter and pass clicked listener this
      myAdapter = new MyRecyclerViewAdapter(context, this);
    
    
  • AdapterViewHolder :

      public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ItemViewHolder> {
         ... ... 
         private Context context;
         private static RecyclerViewClickListener itemListener;
    
    
         public MyRecyclerViewAdapter(Context context, RecyclerViewClickListener itemListener) {
             this.context = context;
             this.itemListener = itemListener;
             ... ...
         }
    
    
         //ViewHolder class implement OnClickListener, 
         //set clicklistener to itemView and, 
         //send message back to Activity/Fragment 
         public static class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
             ... ...
             public ItemViewHolder(View convertView) {
                 super(convertView);
                 ... ...
                 convertView.setOnClickListener(this);
             }
    
             @Override
             public void onClick(View v) {
                 itemListener.recyclerViewListClicked(v, this.getPosition());     
    
             }
         }
      }
    
    

テスト後、正常に動作しています。

[ UPDATE ]

API22から RecyclerView.ViewHolder.getPosition() は非推奨なので、代わりに getLayoutPosition() .