package com.timehop.stickyheadersrecyclerview; import android.support.v7.widget.RecyclerView; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.SoundEffectConstants; import android.view.View; public class StickyRecyclerHeadersTouchListener implements RecyclerView.OnItemTouchListener { private final GestureDetector mTapDetector; private final RecyclerView mRecyclerView; private final StickyRecyclerHeadersDecoration mDecor; private OnHeaderClickListener mOnHeaderClickListener; public interface OnHeaderClickListener { public void onHeaderClick(View header, int position, long headerId); } public StickyRecyclerHeadersTouchListener(final RecyclerView recyclerView, final StickyRecyclerHeadersDecoration decor) { mTapDetector = new GestureDetector(recyclerView.getContext(), new SingleTapDetector()); mRecyclerView = recyclerView; mDecor = decor; } public StickyRecyclerHeadersAdapter getAdapter() { if (mRecyclerView.getAdapter() instanceof StickyRecyclerHeadersAdapter) { return (StickyRecyclerHeadersAdapter) mRecyclerView.getAdapter(); } else { throw new IllegalStateException("A RecyclerView with " + StickyRecyclerHeadersTouchListener.class.getSimpleName() + " requires a " + StickyRecyclerHeadersAdapter.class.getSimpleName()); } } public void setOnHeaderClickListener(OnHeaderClickListener listener) { mOnHeaderClickListener = listener; } @Override public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) { return mOnHeaderClickListener != null && mTapDetector.onTouchEvent(e); } @Override public void onTouchEvent(RecyclerView view, MotionEvent e) { /* do nothing? */ } private class SingleTapDetector extends GestureDetector.SimpleOnGestureListener { @Override public boolean onSingleTapUp(MotionEvent e) { int position = mDecor.findHeaderPositionUnder((int) e.getX(), (int) e.getY()); if (position != -1) { View headerView = mDecor.getHeaderView(mRecyclerView, position); long headerId = getAdapter().getHeaderId(position); mOnHeaderClickListener.onHeaderClick(headerView, position, headerId); mRecyclerView.playSoundEffect(SoundEffectConstants.CLICK); headerView.onTouchEvent(e); return true; } return false; } @Override public boolean onDoubleTap(MotionEvent e) { return true; } } }