0

Can we give onItemLongClick,OnClick and OnTouch at a time to RecyclerView?I gave all these three but onTouchListener is only working .if i remove ontouch both itemclick and longitemclick are worrking.if i give onTouch only onTouch is working remaining onClick, can any of u let me know i have to work these three at a time.Please let me know.thanks!!!I saw description here i didn't get solution

Here Is my ListAdapter.java

class ListAdapter extends RecyclerView.Adapter {

private List<String> mList,mList1,mList2,mList3,mList4,mList5;
private Listener mListener;
Context mcontext;


ListAdapter(List<String> list,List<String> list_1,List<String> list_2,List<String> list_3,List<String> list_4,List<String> list_5,Listener listener,Context context)
{
    this.mList = list;
    this.mList1 = list_1;
    this.mList2 = list_2;
    this.mList3 = list_3;
    this.mList4 = list_4;
    this.mList5 = list_5;
    this.mListener = listener;
    this.mcontext=context;

}

@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(
            parent.getContext()).inflate(R.layout.list_row, parent, false);
    return new ListViewHolder(view);
}

@Override
public void onBindViewHolder(final ListViewHolder holder, final int position)
{



    holder.text.setText("Destination Is:"+mList.get(position));
    holder.text_1.setText("Item Title:"+mList1.get(position));
    holder.text_2.setText("Item Date:"+mList2.get(position));
    holder.text_3.setText("Item Time:"+mList3.get(position));
    holder.text_4.setText("Item Id:"+mList4.get(position));
    holder.text_5.setText("Assigned Person:"+mList5.get(position));

    holder.frameLayout.setTag(position);
           holder.frameLayout.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction())
                    {
                        case MotionEvent.ACTION_DOWN:
                            ClipData data = ClipData.newPlainText("", "");
                            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);

                            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                                view.startDragAndDrop(data, shadowBuilder, view, 0);
                            } else {
                                view.startDrag(data, shadowBuilder, view, 0);
                            }
                            return true;
                    }
                    return false;
                }
            });
    holder.frameLayout.setOnDragListener(new DragListener(mListener));
   holder.itemView.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View view)
        {
            Toast.makeText(mcontext, ""+mList.get(position), Toast.LENGTH_SHORT).show();
            mList1.get(position);
            mList2.get(position);
            mList3.get(position);
            mList4.get(position);
            mList5.get(position);
        }
    });
    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            Toast.makeText(mcontext, "You Clicked So Much Time Dude", Toast.LENGTH_SHORT).show();
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                view.startDragAndDrop(data, shadowBuilder, view, 0);
            } else {
                view.startDrag(data, shadowBuilder, view, 0);
            }
            return true;
        }
    });

}

DragListener getDragInstance() {
    if (mListener != null) {
        return new DragListener(mListener);
    } else {
        Log.e("ListAdapter", "Listener wasn't initialized!");
        return null;
    }
}

@Override
public int getItemCount() {
    return mList.size();
}

List<String> getList()
{
    return mList;
}

void updateList(List<String> list) {
    mList = list;
}

}

3 Answers3

0

Please tyr this one:

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

            void onLongClick(View view, int position);
        }

        public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

            private GestureDetector gestureDetector;
            private MainActivity.ClickListener clickListener;

            public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final MainActivity.ClickListener clickListener) {
                this.clickListener = clickListener;
                gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
                    @Override
                    public boolean onSingleTapUp(MotionEvent e) {
                        return true;
                    }

                    @Override
                    public void onLongPress(MotionEvent e) {
                        View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
                        if (child != null && clickListener != null) {
                            clickListener.onLongClick(child, recyclerView.getChildPosition(child));
                        }
                    }
                });
            }

            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {

                View child = rv.findChildViewUnder(e.getX(), e.getY());
                if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
                    clickListener.onClick(child, rv.getChildPosition(child));
                }
                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView rv, MotionEvent e) {
            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        }

Finally add the recycler view item click listener as mentioned below.

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Toast.makeText(getApplicationContext(), ""+position, Toast.LENGTH_SHORT).show();
            }

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

            }
        }));
Chetan Pushpad
  • 345
  • 1
  • 9
0

use OnLongClick Listener in container view or root view and set click Listener on its child view.

and handle listner by get view v .get id method to differentiate between them like below

public void Onclick(View v){

if (v.getId()==(Integer)R.id.container_root){
}

 if (v.getId()==(Integer)R.id.child_element){
}

}

use something like this . this might be your solution

Rizwan
  • 163
  • 2
  • 8
-1

I haven't tried it just wrote the code as per my theoretical knowledge.

Create your own OnTouchListener:

public class RecyclerViewOnTouchListener implements OnTouchListener {

    private final GestureDetector gestureDetector;

    public OnSwipeTouchListener (Context ctx, ListAdapter listAdapter){
        gestureDetector = new GestureDetector(ctx, new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {

            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {

            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }
        });
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
}

In the above code for single click onSingleTapUp(...){} will be called, for long press onLongPress(...){} will be called, for touch onTouch(...){} will be called.

In your adapter change this:

holder.frameLayout.setOnTouchListener(new View.OnTouchListener()....}

To this:

holder.frameLayout.setOnTouchListener(new RecyclerViewOnTouchListener(getContext(), this)...}

Inside your adapter write 3 public methods to do something on click, on long click, on touch and call them inside respective methods in the RecyclerViewOnTouchListener class.

Hope this works! Let me know! :)

Aishwarya Tiwari
  • 625
  • 4
  • 19
  • but recylcer view accept and can accept this OnTouchListener public interface OnItemTouchListener { boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e); void onTouchEvent(RecyclerView rv, MotionEvent e); void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept); } – Sattar Oct 26 '21 at 10:50