4

我正在使用Firebase UI FirebaseRecyclerAdapter填充RecyclerView。我设法从我的项目视图的组件(标题)获得点击事件,但不能在项目视图中的任何位置使用,这正是我需要的。我跟着谷歌样本。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

尝试在GigViewHolder构造函数中设置您的点击侦听器,如视图。setOnClickListener(clickListener);由于您已经为艺术家标题设置了监听者,因此我认为您只会在该文本视图点击时获得回调。 –

+0

试过之前,这让GIGViewHolder实现了View.OnClickListener,添加了一个不起作用的onClick方法。 –

+0

我认为不需要在ViewHolderClass上实现onClickListener,就像在bindToGig中设置类级别的clickListener一样。然后设置相同的clickListener来查看哪些是您的构造函数引用。 –

回答

1

这个问题有几个答案。一个为我工作的答案是由Frank van Puffelenhow-to-implement-a-setonitemclicklistener-firebaserecyclerviewadapter

你需要改变一些东西。

之前你里面GigViewHolder构造public class GigViewHolder extends RecyclerView.ViewHolder这样定义View itemView;

一个全局变量里面GigViewHolder构造,指定这个变量作为参数传递你的构造认为这样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; 
     } 
    };