package mcxtzhang.recyclerviewdemo.itemlistener; import android.content.Context; import android.graphics.Rect; import android.support.v4.view.GestureDetectorCompat; import android.support.v4.view.ViewCompat; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import java.util.List; /** * 介绍:还没能解决 touch事件和内部View事件冲突的问题 * 作者:zhangxutong * 邮箱:zhangxutong@imcoming.com * 时间: 2016/10/21. */ public abstract class OnItemTouchListener<T extends RecyclerView.ViewHolder, D> implements RecyclerView.OnItemTouchListener { protected abstract void onItemClick(T viewHolder, D data, View itemView, int position); protected abstract void onItemLongClick(T viewHolder, D data, View itemView, int position); private GestureDetectorCompat mGestureDetector; private RecyclerView mRv; private List<D> mDatas; public OnItemTouchListener(Context context, RecyclerView rv, List<D> datas) { mRv = rv; mDatas = datas; mGestureDetector = new GestureDetectorCompat(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { View view = mRv.findChildViewUnder(e.getX(), e.getY()); if (null != view) { if (view instanceof ViewGroup) { ViewGroup vg = (ViewGroup) view; Rect bounds = null; for (int i = 0; i < vg.getChildCount(); i++) { View child = vg.getChildAt(i); bounds = new Rect(); child.getLocalVisibleRect(bounds); Log.d("TAG1", "onSingleTapUp() called with: bounds = [" + bounds + "]"); } } int position = mRv.getChildLayoutPosition(view); onItemClick((T) mRv.findContainingViewHolder(view), mDatas.get(position), view, position); } return true; } @Override public void onLongPress(MotionEvent e) { View view = mRv.findChildViewUnder(e.getX(), e.getY()); if (null != view) { int position = mRv.getChildLayoutPosition(view); onItemLongClick((T) mRv.findContainingViewHolder(view), mDatas.get(position), view, position); } } }); } public View findChildViewUnder(ViewGroup viewGroup, float x, float y) { final int count = viewGroup.getChildCount(); for (int i = count - 1; i >= 0; i--) { final View child = viewGroup.getChildAt(i); final float translationX = ViewCompat.getTranslationX(child); final float translationY = ViewCompat.getTranslationY(child); if (x >= child.getLeft() + translationX && x <= child.getRight() + translationX && y >= child.getTop() + translationY && y <= child.getBottom() + translationY) { return child; } } return null; } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { mGestureDetector.onTouchEvent(e); } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } }