1

How do I implement an OnClickListener on a RecyclerView??

Online tutorials show the implementation of OnItemTouchListener, but they are a little vague. Could someone show the code for a simple implementation of touch interaction with a RecyclerView.

One article i came across : http://sapandiwakar.in/recycler-view-item-click-handler/

This provides a vague picture of how to go about it, but could someone make things clear. Thanks.

N J
  • 27,217
  • 13
  • 76
  • 96
Arjun Issar
  • 672
  • 4
  • 13
  • 32
  • 2
    possible duplicate of [Why doesn't RecyclerView have onItemClickListener()? And how RecyclerView is different from Listview?](http://stackoverflow.com/questions/24885223/why-doesnt-recyclerview-have-onitemclicklistener-and-how-recyclerview-is-dif) – King of Masses Aug 18 '15 at 11:40

3 Answers3

2

If you are using custom adapter then you can use OnClickListener method like this in your Holder class.

public class DataObjectHolder extends RecyclerView.ViewHolder {
        TextView header , resp_id , time;
        ImageView status,info,delete,upload;

        public DataObjectHolder(View itemView) {
            super(itemView);
            header = (TextView) itemView.findViewById(R.id.header_text_inc);
            resp_id = (TextView) itemView.findViewById(R.id.resp_text_inc);
            time = (TextView) itemView.findViewById(R.id.time_text_inc);
            delete =(ImageView)itemView.findViewById(R.id.delete_inc_image);
        Log.e(LOG_TAG, "Adding Listener");



            itemView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub

                   // do something here                 
                }
            });
        delete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                r_bean = mDataset.get(getAdapterPosition());

            }
        });
SRB Bans
  • 3,096
  • 1
  • 10
  • 21
1

For RecyclerView item OnItemTouchListener is best way

But you can do it click on Item by following in adpter

 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    ...
    holder.itemView.setOnClickListener(..)
    ...
 }

For swipe on RecyclerView

 ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder viewHolder1) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            //Remove swiped item from list and notify the RecyclerView

            if (swipeDir == ItemTouchHelper.LEFT) {
                Snackbar.make(recyclerViewCards, getString(R.string.item_deleted),
                        Snackbar
                                .LENGTH_LONG)
                        .show();
                showVisitingCardsPresenterImpl.detletCardFromRealm(Realm.getInstance
                                (ShowVisitingCardsActivity.this), mAdapter.getID(viewHolder
                                .getAdapterPosition()), viewHolder
                                .getAdapterPosition()
                );

            } else {
                showVisitingCardsPresenterImpl.startVisitingCardUpdateActivity(mAdapter.getID(viewHolder
                        .getAdapterPosition()));
            }
        }
    };

see this link for complete left-to-right and right-to-left swipe detection

N J
  • 27,217
  • 13
  • 76
  • 96
1

You can use holder.root for item click in the customadapter

 @Override
    public void onBindViewHolder(final MyAdapter.ViewHolder1 holder,  final int position) {

    holder.root.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
         //write your code here
        }         
    });

}

and you have to use this

 mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {


       @Override
       public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
           child = recyclerView.findChildViewUnder(motionEvent.getX(),motionEvent.getY());


           if(child!=null && mGestureDetector.onTouchEvent(motionEvent)){
               //Drawer.closeDrawers();
        //write your code here

               return true;
           }             

           if(txt!=null)
           {


       }
       });
King of Masses
  • 18,405
  • 4
  • 60
  • 77
mominapk
  • 81
  • 1
  • 12