Firebase UI RecyclerView onClick
Posted
技术标签:
【中文标题】Firebase UI RecyclerView onClick【英文标题】: 【发布时间】:2016-11-10 19:50:21 【问题描述】:我正在使用 Firebase UI FirebaseRecyclerAdapter 来填充 RecyclerView。我设法从我的项目视图(标题)的组件中获取点击事件,但不是在项目视图中的任何地方,这是我需要的。我跟着谷歌示例。
在我的活动中:
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 + 界面,也没有运气。
【问题讨论】:
尝试在 GigViewHolder 构造函数中设置您的点击监听器,例如 view.setOnClickListener(clickListener);由于您只为艺术家标题设置了侦听器,因此我认为您只会在该文本视图单击时获得回调。 之前试过,让GigViewHolder实现View.OnClickListener,加了一个onClick方法也不起作用。 我认为不需要像在 bindToGig 中那样在 ViewHolderClass 上实现 onClickListener 您正在设置类级别的 clickListener 对吗?然后设置相同的 clickListener 以查看哪个是您的构造函数引用。 【参考方案1】:为 FirebaseRecyclerViewAdapter 中的整行/项目实现点击和长点击监听器。
我就是这样做的。
首先,在
ViewHolder
类中定义一个接口来发送回调。 在其构造函数中,您可以为整行或单个组件设置单击/长按侦听器。 然后覆盖FirebaseRecyclerAdapter
中的onCreateViewHolder
,您将在其中实现此接口。
实施
我的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;
;
【讨论】:
大部分都有效,但是我在第二部分调用FirebaseViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);
时遇到了麻烦。设法让它与它一起工作:View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); FirebaseViewHolder vh = new FirebaseViewHolder (v); vh.setOnClickListener(new SpellCardViewHolder.ClickListener() ... ); return vh; ;
【参考方案2】:
这个问题有几个答案。对我有用的是Frank van Puffelen
how-to-implement-a-setonitemclicklistener-firebaserecyclerviewadapter提供的答案
你需要做一些改变。
在public class GigViewHolder extends RecyclerView.ViewHolder
内的GigViewHolder
构造函数之前定义一个像这样的全局变量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
【讨论】:
以上是关于Firebase UI RecyclerView onClick的主要内容,如果未能解决你的问题,请参考以下文章
如何从所有用户 ID (UID) 中获取特定值并保存在 RecyclerView Firebase UI
Firebase:Recyclerview 没有附加适配器,跳过布局
Firebase:Recyclerview 没有附加适配器,跳过布局
从 UI 和 Firebase 实时数据库中删除 CardView 数据?