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 Puffelenhow-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 数据?

每次firebase实时数据库数据集时,RecyclerView都会重新加载

Recyclerview 不会从 firebase 检索数据