Skip to content

Instantly share code, notes, and snippets.

@doodeec
Last active April 18, 2016 08:51
Show Gist options
  • Save doodeec/2d863c7e309792f99728 to your computer and use it in GitHub Desktop.
Save doodeec/2d863c7e309792f99728 to your computer and use it in GitHub Desktop.
RecyclerView item click/item long tap listener
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
private OnItemClickListener mListener;
public interface OnItemClickListener {
/**
* Fires when recycler view receives a single tap event on any item
*
* @param view tapped view
* @param position item position in the list
*/
public void onItemClick(View view, int position);
/**
* Fires when recycler view receives a long tap event on item
*
* @param view long tapped view
* @param position item position in the list
*/
public void onItemLongClick(View view, int position);
}
GestureDetector mGestureDetector;
ExtendedGestureListener mGestureListener;
public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureListener = new ExtendedGestureListener();
mGestureDetector = new GestureDetector(context, mGestureListener);
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null) {
mGestureListener.setHelpers(childView, view.getChildPosition(childView));
mGestureDetector.onTouchEvent(e);
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
/**
* Extended Gesture listener react for both item clicks and item long clicks
*/
private class ExtendedGestureListener extends GestureDetector.SimpleOnGestureListener {
private View view;
private int position;
public void setHelpers(View view, int position) {
this.view = view;
this.position = position;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
mListener.onItemClick(view, position);
return true;
}
@Override
public void onLongPress(MotionEvent e) {
mListener.onItemLongClick(view, position);
}
}
}
@doodeec
Copy link
Author

doodeec commented Jan 24, 2015

A simple RecyclerView item click/longTap listener.

RecyclerItemClickListener.OnItemClickListener itemClickListener = ... // new instance
listener = new RecyclerItemClickListener(getActivity(), itemClickListener);
mList.addOnItemTouchListener(mCurrentlyRegisteredListener);

Make sure to remove currently added touch listener before the new one is added. RecyclerView keeps a list of all listeners, so adding a new listener does not clear the previous one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment