Search code examples
androidandroid-recyclerviewonclicklisteneronitemclicklistener

addOnItemTouchListener or setOnClickListener on item in a RecyclerView?


Which is the most recommended way of handling click on RecyclerView items?

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
    private RecyclerView.OnItemTouchListener itemTouchListener;

    @Override
    public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {
        return false;
    }

    @Override
    public void onTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent motionEvent) {}

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean b) {}
});

Or setting a click listener on an item view inside the adapter?

itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //Do stuff
    }
});

Solution

  • A Best and efficient way to get a click of recycler view item is by using interface as below:

    1) First, define one interface as below

    public interface OnListItemClick {
       void onClick(View view, int position);
    }
    

    2) Now, set it from your fragment or activity

    OnListItemClick onListItemClick = new OnListItemClick() {
                                @Override
                                public void onClick(View view, int position) {
                                  // you will get click here 
                                    // do your code here
                                 }
                              };
    youradaptor.setClickListener(onListItemClick);
    

    3) Now create one method in your adapter

    public void setClickListener(OnListItemClick context) {
        this.onListItemClick = context;
    }
    

    4) Now, from your itemview click use as below

    itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                onListItemClick.onClick(view, getAdapterPosition()); // passing click to interface
            }
    });