Skip to content Skip to sidebar Skip to footer

Onclicklistener On Recylerview And Getting The Id Of Clicked Item

I need to set onClickListener on RecyclerView which gets the Json Id of an Item Clicked and redirects to the fragment which displays the details of the product based on that Json I

Solution 1:

@Override
    publicvoidonBindViewHolder(MyViewHolder holder, int position) {
        holder.name.setText(ads.get(position).getTitle());
        holder.details.setText("Rs. " +ads.get(position).getPrice().toString()+ "/-");        Glide.with(context).load(ads.get(position).getPhoto1()).into(holder.thumbnail);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            publicvoidonClick(View view) {
                String id=ads.get(position).getId();
                //You can call detail fragment here
            }
        });
    }

Note: Remove onclick listener from ViewHolder

Solution 2:

try this using below class you can get recyclerview onclick listener and longclick listneeers

create a RecyclerItemClickListener class

publicclassRecyclerItemClickListenerimplementsRecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;

publicinterfaceOnItemClickListener {
    publicvoidonItemClick(View view, int position);

    publicvoidonLongItemClick(View view, int position);
}

GestureDetector mGestureDetector;

publicRecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
    mListener = listener;
    mGestureDetector = newGestureDetector(context, newGestureDetector.SimpleOnGestureListener() {
        @OverridepublicbooleanonSingleTapUp(MotionEvent e) {
            returntrue;
        }

        @OverridepublicvoidonLongPress(MotionEvent e) {
            Viewchild= recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child != null && mListener != null) {
                mListener.onLongItemClick(child, recyclerView.getChildAdapterPosition(child));
            }
        }
    });
}

@OverridepublicbooleanonInterceptTouchEvent(RecyclerView view, MotionEvent e) {
    ViewchildView= view.findChildViewUnder(e.getX(), e.getY());
    if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
        mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        returntrue;
    }
    returnfalse;
}

@OverridepublicvoidonTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}


@OverridepublicvoidonRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}

now add lister to recyclerview like this

indexRecyclerView.addOnItemTouchListener(
            new RecyclerItemClickListener(MainActivity.this, indexRecyclerView, new RecyclerItemClickListener.OnItemClickListener() {

                @Override
                public void onItemClick(View view, int position) {
                   /// perform your action here


                }

                @Override
                public void onLongItemClick(View view, int position) {

                }
            })
    );

ask me in case of any query

Solution 3:

Try this:

itemView.setOnClickListener(newView.OnClickListener() {
                @OverridepublicvoidonClick(View v) {
                    int position = getLayoutPosition();
                    String id=ads.get(position).getId();
                    // call fragment
                }
}

Add this in ViewHolder Constructor.

Solution 4:

You can add Ad ad = ads.get(RecyclerAdapter.MyViewHolder.this.getAdapterPosition()); in your OnCkick method to retrieve the current object. Then use Interface to pass the value to the fragment.

@OverridepublicvoidonClick(View view) {
                Toast.makeText(view.getContext(), "Clicked on Recycler View" , Toast.LENGTH_SHORT).show();
                Adad= ads.get(RecyclerAdapter.MyViewHolder.this.getAdapterPosition());
               //use interface to pass ad to the fragment....
            }

Solution 5:

Your adapter class should be like below.

You have to remove onClickListener from ViewHolder class. and set click in onBindViewHolder Method.

publicclassRecyclerAdapterextendsRecyclerView.Adapter<RecyclerAdapter.MyViewHolder>{

    private List<Ad> ads;
    private Context context;



    publicRecyclerAdapter(List<Ad> ads, Context context){
        this.ads=ads;
        this.context=context;

    }


    @Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item_ads, parent,false);
        returnnewMyViewHolder(view);
    }

    @OverridepublicvoidonBindViewHolder(MyViewHolder holder, int position) {
        holder.name.setText(ads.get(position).getTitle());
        holder.details.setText("Rs. " +ads.get(position).getPrice().toString()+ "/-");
//        Glide.with(context).load(ads.get(position).getPhoto1()).into(holder.thumbnail);
        holder.linearLayout.setOnClickListener(newView.OnClickListener() {
            @OverridepublicvoidonClick(View view) {
                /*Write your code here to send data to fragment*/Adad= ads.get(position);
            }
        });


    }

    @OverridepublicintgetItemCount() {
        return ads.size();
    }




    publicstaticclassMyViewHolderextendsRecyclerView.ViewHolder{

        ImageView thumbnail;
        TextView name, details;
        LinearLayout linearLayout;
        publicMyViewHolder(View itemView) {
            super(itemView);
//            thumbnail=(ImageView)itemView.findViewById(R.id.thumbnail);
            name=(TextView)itemView.findViewById(R.id.title);
            details=(TextView)itemView.findViewById(R.id.price);
            linearLayout=(TextView)itemView.findViewById(R.id.linearLayout); // its your main layout
        }



    }
}

Post a Comment for "Onclicklistener On Recylerview And Getting The Id Of Clicked Item"