Firebase UI RecyclerView onClick

6
我将使用Firebase UI FirebaseRecyclerAdapter来填充RecyclerView。我已经成功获取了项目视图组件(标题)的点击事件,但无法获取项目视图中任何其他位置的点击事件,这正是我所需要的。我遵循了Google提供的示例。
在我的Activity中:
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);由于您仅为艺术家标题设置了侦听器,因此我认为您只会在该文本视图单击时获得回调。 - Drup Desai
之前尝试过了,让GigViewHolder实现View.OnClickListener,添加一个onClick方法,但也不起作用。 - Pedro Gonzalez
我认为在ViewHolderClass上不需要实现onClickListener,因为在bindToGig中你已经设置了类级别的clickListener,对吧?那么将相同的clickListener设置到视图中,这是你构造函数的引用。 - Drup Desai
2个回答

16

为FirebaseRecyclerViewAdapter实现整行/每个项目的点击和长按监听器。

我是这样做的。

首先,在您的ViewHolder类中定义一个接口以发送回调。在其构造函数内,您可以为整行或单个组件设置单击/长按监听器。
然后覆盖FirebaseRecyclerAdapteronCreateViewHolder方法,其中您将实现此接口。

实现

我的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;
        }
    };

1
大部分都能正常工作,但在第二部分中调用 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; } }; - StackAttack

1
这个问题有几个答案。对我有用的一个是由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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接