This repository has been archived by the owner on Mar 24, 2023. It is now read-only.
/
StickyRecyclerHeadersTouchListener.java
84 lines (72 loc) · 2.92 KB
/
StickyRecyclerHeadersTouchListener.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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 {
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) {
if (this.mOnHeaderClickListener != null) {
boolean tapDetectorResponse = this.mTapDetector.onTouchEvent(e);
if (tapDetectorResponse) {
// Don't return false if a single tap is detected
return true;
}
if (e.getAction() == MotionEvent.ACTION_DOWN) {
int position = mDecor.findHeaderPositionUnder((int)e.getX(), (int)e.getY());
return position != -1;
}
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent e) { /* do nothing? */ }
@Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
// 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;
}
}
}