Firebase UI RecyclerView onClick

喜你入骨 提交于 2019-11-29 00:21:08

Implementing click and long click listener for entire row / items in FirebaseRecyclerViewAdapter.

I did this in this way.

First, define an interface in your ViewHolder class to send callbacks. Inside its constructor, you can set click/long-click listener for entire row or a single componnent.
Then override onCreateViewHolder of FirebaseRecyclerAdapter where you will implement this interface.

IMPLEMENTATION

My FirebaseViewHolder class.

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

Creating the 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;
        }
    };
crakama

There are several answers to this question. One that worked for me was the answer provided by Frank van Puffelen how-to-implement-a-setonitemclicklistener-firebaserecyclerviewadapter

You need to change few things.

Before GigViewHolder constructor inside your public class GigViewHolder extends RecyclerView.ViewHolder define a global variable like this View itemView;

Inside GigViewHolder constructor, assign this variable the view passed as a parameter on your constructor like this this.itemView= view;

Then use this itemView in your populateViewHolder method as you had done as also shown

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
            }
        });

You can also explore other options on the following links: RecyclerView onClick

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!