-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathOnitemClickListener.java
113 lines (100 loc) · 4.07 KB
/
OnitemClickListener.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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.slt.sltca.widget;
import android.graphics.Rect;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import com.slt.sltca.R;
import com.slt.sltca.tools.LogUtils;
/**
* 作者:孙贤武 on 2016/12/06 10:30
* 邮箱:[email protected]
* LIKE:YANSHUO
* RecyclerView的item点击
*/
public abstract class OnitemClickListener implements RecyclerView.OnItemTouchListener
{
private GestureDetectorCompat mMyDetector;
private RecyclerView mRecyclerView;
private String ChildClickTAG = null;
public OnitemClickListener(RecyclerView recyclerView)
{
mRecyclerView = recyclerView;
mMyDetector = new GestureDetectorCompat(recyclerView.getContext(), new MyDetectorListenr());
ChildClickTAG = mRecyclerView.getContext()
.getResources().getString(R.string.recyclerview_itemchild_onclick);
}
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e)
{
mMyDetector.onTouchEvent(e);
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e)
{
mMyDetector.onTouchEvent(e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept)
{
}
class MyDetectorListenr extends GestureDetector.SimpleOnGestureListener
{
@Override
public boolean onSingleTapUp(MotionEvent e)
{
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null) {
if (childViewUnder instanceof ViewGroup) {
if (onChildClick(e.getRawX(), e.getRawY(), (ViewGroup) childViewUnder, mRecyclerView.findContainingViewHolder(childViewUnder))) {
return true;
} else {
onItemClick(childViewUnder, mRecyclerView.findContainingViewHolder(childViewUnder));
}
} else {
onItemClick(childViewUnder, mRecyclerView.findContainingViewHolder(childViewUnder));
}
}
return true;
}
@Override
public void onLongPress(MotionEvent e)
{
View childViewUnder = mRecyclerView.findChildViewUnder(e.getX(), e.getY());
if (childViewUnder != null) {
onItemLongClick(childViewUnder, mRecyclerView.findContainingViewHolder(childViewUnder));
}
super.onLongPress(e);
}
}
private boolean onChildClick(float x, float y, ViewGroup group, final RecyclerView.ViewHolder holder)
{
boolean returnis = false;
Rect rect = new Rect();
for (int i = 0, count = group.getChildCount(); i < count; i++) {
final View view = group.getChildAt(i);
view.getGlobalVisibleRect(rect);
LogUtils.LOGE("rect:"+rect.toString()+"--"+x+"--"+y);
if (view instanceof ViewGroup) {
onChildClick(x, y, (ViewGroup) view, holder);
} else {
Object TAG = view.getTag();
LogUtils.LOGE("tag1:" + ChildClickTAG);
if (TAG != null) {
LogUtils.LOGE("tag2:" + TAG.toString());
if (TAG.toString().equals(ChildClickTAG) && view.isClickable() && rect.contains((int) x, (int) y)) {
LogUtils.LOGE("view_click");
returnis = onItemChildClick(view, view.getId(), holder);
}
}
}
}
return returnis;
}
public abstract void onItemClick(View view, RecyclerView.ViewHolder holder);
public abstract void onItemLongClick(View view, RecyclerView.ViewHolder holder);
public abstract boolean onItemChildClick(View view, int id, RecyclerView.ViewHolder holder);
}