Skip to content

Instantly share code, notes, and snippets.

@zhcnxf
Last active October 2, 2015 08:19
Show Gist options
  • Save zhcnxf/25d47a3cc2ea058359e0 to your computer and use it in GitHub Desktop.
Save zhcnxf/25d47a3cc2ea058359e0 to your computer and use it in GitHub Desktop.
RecyclerView.OnItemClickListener
package org.taosha.android.widget;
import android.support.v7.widget.RecyclerView;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
/**
* Created by San on 8/31/15.
*/
public class OnItemClickAdapter implements RecyclerView.OnItemTouchListener {
private final OnItemClickListener mOnItemClickListener;
private boolean mIsNotClick;
private View mClickingChild;
private boolean mDisallowIntercept;
public OnItemClickAdapter(OnItemClickListener onItemClickListener) {
this.mOnItemClickListener = onItemClickListener;
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent ev) {
int action = ev.getActionMasked();
if (action != MotionEvent.ACTION_DOWN && mDisallowIntercept)
return false;
switch (action) {
case MotionEvent.ACTION_UP: {
if (!mIsNotClick && mClickingChild != null) {
performOnItemClick(rv, mClickingChild);
}
break;
}
case MotionEvent.ACTION_MOVE: {
if (!mIsNotClick && mClickingChild != null) {
View child = rv.findChildViewUnder(ev.getX(), ev.getY());
if (child != mClickingChild) {
mIsNotClick = true;
mClickingChild.setPressed(false);
}
}
break;
}
case MotionEvent.ACTION_DOWN: {
final View child = mClickingChild = rv.findChildViewUnder(ev.getX(), ev.getY());
if (child != null) {
child.setPressed(true);
mIsNotClick = false;
} else {
mIsNotClick = true;
}
mDisallowIntercept = false;
break;
}
}
return false;
}
private void performOnItemClick(RecyclerView rv, View child) {
RecyclerView.ViewHolder vh = rv.getChildViewHolder(child);
rv.post(() -> {
mOnItemClickListener.onItemClick(rv, vh);
});
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
this.mDisallowIntercept = disallowIntercept;
}
public interface OnItemClickListener {
void onItemClick(RecyclerView rv, RecyclerView.ViewHolder viewHolder);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment