4

Firebase UI FirebaseRecyclerAdapterを使用して、RecyclerViewを生成しています。アイテムビュー(タイトル)のコンポーネントからクリックイベントを取得することはできましたが、アイテムビューのどの場所でも必要なイベントは表示されませんでした。私はGoogleのサンプルに従った。私の活動にFirebase UI RecyclerView onClick

private void setRecyclerView() { 
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view_gigs); 
    recyclerView.setHasFixedSize(true); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    mAdapter = new FirebaseRecyclerAdapter<Gig, GigViewHolder>(Gig.class, 
      R.layout.list_item_card, 
      GigViewHolder.class, 
      reference) { 
     @Override 
     protected void populateViewHolder(final GigViewHolder viewGig, Gig model, final int position) { 

      viewGig.itemView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.i(Utils.TAG, "onItemClickGeneral: position " + position); 
        // this doesn't work 
       } 
      }); 
      viewGig.bindToGig(model, new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Log.i(Utils.TAG, "onItemClickTitle: position " + position); 
        // this works 
       } 
      }); 
     } 
    }; 
    recyclerView.setAdapter(mAdapter); 
} 

と私ViewHolderClassは:

public class GigViewHolder extends RecyclerView.ViewHolder { 

ImageView ivIconArtist; 
TextView tvArtist; 
TextView tvVenue; 
TextView tvDate; 

public GigViewHolder(View view) { 
    super(view); 
    ivIconArtist = (ImageView) view.findViewById(R.id.iv_list_item_icon_artist); 
    tvArtist = (TextView) view.findViewById(R.id.tv_list_item_artist); 
    tvVenue = (TextView) view.findViewById(R.id.tv_list_item_venue); 
    tvDate = (TextView) view.findViewById(R.id.tv_list_item_date); 
} 

public void bindToGig(Gig gig, View.OnClickListener clickListener) { 
    tvArtist.setText(gig.getArtist()); 
    tvVenue.setText(gig.getVenue()); 
    tvDate.setText(gig.getDate()); 

    tvArtist.setOnClickListener(clickListener); 
} 

}

は、私はどちらかの他の回答で提案されているカスタムonclicklistener +インタフェース、運を試してみました。

+0

click listenerをviewのようなGigViewHolderコンストラクタに設定してみてください。setOnClickListener(clickListener);あなたが唯一のアーティストのタイトルのリスナーを設定しているので、私はあなたがそのtextviewのクリックでコールバックを得るだろうと思う。 –

+0

前に試したことは、GigViewHolderにView.OnClickListenerを実装させ、どちらも動作しないonClickメソッドを追加することです。 –

+0

私はbindHelderClassでonClickListenerを実装する必要はないと思うbindToGigでクラスレベルのclickListenerを右に設定しています。同じclickListenerを設定して、どちらがコンストラクタ参照であるかを確認します。 –

答えて

1

この質問にはいくつかの回答があります。私のために働いた答えは、答えがFrank van Puffelenhow-to-implement-a-setonitemclicklistener-firebaserecyclerviewadapter

によって提供されました。

あなたの内側GigViewHolderコンストラクタ前public class GigViewHolder extends RecyclerView.ViewHolderGigViewHolderコンストラクタ内でこのView itemView;

のようなグローバル変数を定義する次に、このthis.itemView= view;

のように、この変数をあなたのコンストラクタにパラメータとして渡されたビューを割り当てますpopulateViewHolderメソッドでこのitemViewを使用した場合は、これも図のように

viewGig.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.i(Utils.TAG, "onItemClickGeneral: position " + position); 
       // This WORKS, write your TODO here 
      } 
     }); 

また、次のリンクを、他の選択肢を模索することができます RecyclerView onClick

14

FirebaseRecyclerViewAdapterで行全体/アイテムのための実装クリックし、長いクリックリスナーを。

私はこのようにしました。

まず、コールバックを送信するために、あなたViewHolderクラスのインタフェースを定義します。 コンストラクタ内で、行全体または単一のコンポーネントに対してクリック/ロングクリックリスナーを設定できます。
onCreateViewHolderFirebaseRecyclerAdapterをオーバーライドして、このインターフェイスを実装します。

実装

マイFirebaseViewHolderクラス。

public class FirebaseViewHolder extends RecyclerView.ViewHolder { 

    public ImageView mImageView; 
    public TextView mPostTitle; 
    public TextView mPostDesc; 

    public FirebaseViewHolder(View itemView) { 
     super(itemView); 

     mImageView = (ImageView) itemView.findViewById(R.id.image_recyclerview); 
     mPostTitle = (TextView) itemView.findViewById(R.id.tv_title_recyclerview_item); 
     mPostDesc = (TextView) itemView.findViewById(R.id.tv_desc_recyclerview_item); 

     //listener set on ENTIRE ROW, you may set on individual components within a row. 
     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mClickListener.onItemClick(v, getAdapterPosition()); 

      } 
     }); 
     itemView.setOnLongClickListener(new View.OnLongClickListener() { 
      @Override 
      public boolean onLongClick(View v) { 
       mClickListener.onItemLongClick(v, getAdapterPosition()); 
       return true; 
      } 
     }); 

    } 
    private FirebaseViewHolder.ClickListener mClickListener; 

    //Interface to send callbacks... 
    public interface ClickListener{ 
     public void onItemClick(View view, int position); 
     public void onItemLongClick(View view, int position); 
    } 

    public void setOnClickListener(FirebaseViewHolder.ClickListener clickListener){ 
     mClickListener = clickListener; 
    } 
} 

FirebaseRecyclerAdapterの作成。

FirebaseRecyclerAdapter<Post, FirebaseViewHolder> adapter = new FirebaseRecyclerAdapter<Post, FirebaseViewHolder>(
      Post.class, 
      R.layout.recyclerview_list_item, 
      FirebaseViewHolder.class, 
      databaseReference 

    ) { 
     @Override 
     protected void populateViewHolder(FirebaseViewHolder viewHolder, Post model, int position) { 

      Picasso.with(getActivity()) 
        .load(model.image_url) 
        .into(viewHolder.mImageView); 
      Log.v(TAG, model.image_url); 
      //viewHolder.mImageView.setImageResource(R.mipmap.ic_launcher); 
      viewHolder.mPostTitle.setText(model.title); 
      viewHolder.mPostDesc.setText(model.desc); 
     } 

     @Override 
     public FirebaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
      FirebaseViewHolder viewHolder = super.onCreateViewHolder(parent, viewType); 
      viewHolder.setOnClickListener(new FirebaseViewHolder.ClickListener() { 
       @Override 
       public void onItemClick(View view, int position) { 
        Toast.makeText(getActivity(), "Item clicked at " + position, Toast.LENGTH_SHORT).show(); 
       } 

       @Override 
       public void onItemLongClick(View view, int position) { 
        Toast.makeText(getActivity(), "Item long clicked at " + position, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
      return viewHolder; 
     } 
    }; 
関連する問題