Skip to content

Commit ecfdc69

Browse files
committed
修复第一次长按没有出现的问题
1 parent 6d04a32 commit ecfdc69

File tree

7 files changed

+130
-78
lines changed

7 files changed

+130
-78
lines changed

README.md

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,24 @@ RecyclerView的Item滑动触摸辅助类
66

77
### Gradle引入
88
```
9-
implementation 'com.dyhdyh:item-touch-move-helper:1.0.2'
9+
implementation 'com.dyhdyh:item-touch-move-helper:1.0.3'
1010
```
1111

12-
### 给RecyclerView添加的滑动触摸监听
12+
### 普通的滑动触摸监听
1313
```
14-
recyclerView.addOnItemTouchListener(new SimpleItemTouchMoveListener(this){
14+
recyclerView.addOnItemTouchListener(new SimpleItemTouchMoveListener() {
1515
@Override
1616
public void onItemTouchMove(boolean isTouchChild, View childView, int childPosition, MotionEvent event) {
17-
Log.d("onItemTouchMove----->", isTouchChild + "," + childPosition + "," + event.getX() + "," + event.getY()+","+event.getAction());
17+
//isTouchChild = 是否触摸在itemView上
18+
//childView = 当isTouchChild为true时指触摸的itemView,false时为null
19+
//childPosition = 当isTouchChild为true时指触摸的item位置,false时为-1
20+
Log.d("onItemTouchMove----->", isTouchChild + "," + childPosition + "," + event.getX() + "," + event.getY() + "," + event.getAction());
21+
}
22+
23+
@Override
24+
public boolean onInterceptEnable() {
25+
//当需要拦截事件回调onItemTouchMove的时候返回true,否则false,一般需要动态控制
26+
return true;
1827
}
1928
});
2029
```
@@ -23,17 +32,17 @@ recyclerView.addOnItemTouchListener(new SimpleItemTouchMoveListener(this){
2332
本库内置了一个预览效果的监听,开发者在对应的回调控制预览框即可
2433

2534
```
26-
recyclerView.addOnItemTouchListener(new SimpleMovePreviewListener(this, new OnMovePreviewListener() {
35+
recyclerView.addOnItemTouchListener(new SimpleMovePreviewListener(recyclerView, new OnMovePreviewListener() {
2736
@Override
2837
public void onPreview(View childView, int childPosition) {
29-
//弹出预览框
30-
//popupWindow.showAsDropDown(childView,offsetX,offsetY);
38+
//弹出预览框
39+
//popupWindow.showAsDropDown(childView,offsetX,offsetY);
3140
}
3241
3342
@Override
3443
public void onCancelPreview() {
3544
//取消预览框
36-
//popupWindow.dismiss();
45+
//popupWindow.dismiss();
3746
}
3847
}));
3948
```

app/src/main/java/com/dyhdyh/helper/itemtouch/example/MainActivity.java

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,41 +25,52 @@ protected void onCreate(Bundle savedInstanceState) {
2525

2626
rv = findViewById(R.id.rv);
2727
final ExampleAdapter adapter = new ExampleAdapter(ExampleData.create());
28-
rv.setLayoutManager(new GridLayoutManager(this, 2));
28+
rv.setLayoutManager(new GridLayoutManager(this, 4));
2929
rv.setAdapter(adapter);
3030

3131
/*
32-
rv.addOnItemTouchListener(new SimpleItemTouchMoveListener(this){
33-
@Override
34-
public void onItemTouchMove(boolean isTouchChild, View childView, int childPosition, MotionEvent event) {
35-
Log.d("onItemTouchMove----->", isTouchChild + "," + childPosition + "," + event.getX() + "," + event.getY()+","+event.getAction());
36-
}
37-
});
32+
//普通的Item滑动触摸监听
33+
rv.addOnItemTouchListener(new SimpleItemTouchMoveListener() {
34+
@Override
35+
public void onItemTouchMove(boolean isTouchChild, View childView, int childPosition, MotionEvent event) {
36+
//isTouchChild = 是否触摸在itemView上
37+
//childView = 当isTouchChild为true时指触摸的itemView,false时为null
38+
//childPosition = 当isTouchChild为true时指触摸的item位置,false时为-1
39+
Log.d("onItemTouchMove----->", isTouchChild + "," + childPosition + "," + event.getX() + "," + event.getY() + "," + event.getAction());
40+
}
41+
42+
@Override
43+
public boolean onInterceptEnable() {
44+
//当需要拦截事件回调onItemTouchMove的时候返回true,否则false,一般需要动态控制
45+
return true;
46+
}
47+
});
3848
*/
3949

40-
rv.addOnItemTouchListener(new SimpleMovePreviewListener(this, new OnMovePreviewListener() {
41-
@Override
42-
public void onPreview(View childView, int childPosition) {
43-
Log.d("SimpleMovePreview----->", "onPreview---->" + childPosition + "," + childView);
50+
//微信表情商店预览效果
51+
rv.addOnItemTouchListener(new SimpleMovePreviewListener(rv, new OnMovePreviewListener() {
52+
@Override
53+
public void onPreview(View childView, int childPosition) {
54+
Log.d("SimpleMovePreview----->", "onPreview---->" + childPosition + "," + childView);
4455

45-
final ExampleData item = adapter.getItem(childPosition);
46-
mPreviewWindow.setFileUrl(item.getFile());
56+
final ExampleData item = adapter.getItem(childPosition);
57+
mPreviewWindow.setFileUrl(item.getFile());
4758

48-
if (mPreviewWindow.isShowing()) {
49-
mPreviewWindow.dismiss();
50-
}
51-
//居中
52-
int offsetX = (mPreviewWindow.getWidth() - childView.getWidth()) / 2;
53-
int height = childView.getHeight() + mPreviewWindow.getHeight();
54-
mPreviewWindow.showAsDropDown(childView, -offsetX, -height);
55-
}
59+
if (mPreviewWindow.isShowing()) {
60+
mPreviewWindow.dismiss();
61+
}
62+
//居中
63+
int offsetX = (mPreviewWindow.getWidth() - childView.getWidth()) / 2;
64+
int height = childView.getHeight() + mPreviewWindow.getHeight();
65+
mPreviewWindow.showAsDropDown(childView, -offsetX, -height);
66+
}
5667

57-
@Override
58-
public void onCancelPreview() {
59-
Log.d("SimpleMovePreview----->", "onCancelPreview---->");
60-
mPreviewWindow.dismiss();
61-
}
62-
}));
68+
@Override
69+
public void onCancelPreview() {
70+
Log.d("SimpleMovePreview----->", "onCancelPreview---->");
71+
mPreviewWindow.dismiss();
72+
}
73+
}));
6374
}
6475

6576
}

app/src/main/java/com/dyhdyh/helper/itemtouch/example/adapter/ExampleAdapter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.view.View;
66
import android.view.ViewGroup;
77
import android.widget.ImageView;
8+
import android.widget.Toast;
89

910
import com.bumptech.glide.Glide;
1011
import com.dyhdyh.helper.itemtouch.example.R;
@@ -36,6 +37,13 @@ public void onBindViewHolder(ItemHolder holder, int position) {
3637
.load(item.getCover())
3738
.into(holder.iv);
3839

40+
holder.itemView.setOnClickListener(new View.OnClickListener() {
41+
@Override
42+
public void onClick(View v) {
43+
Toast.makeText(v.getContext(), "click", Toast.LENGTH_SHORT).show();
44+
}
45+
});
46+
3947
}
4048

4149
public ExampleData getItem(int position) {

config.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ ext {
22
android =
33
[
44
//版本号
5-
versionCode : 3,
6-
versionName : "1.0.2",
5+
versionCode : 4,
6+
versionName : "1.0.3",
77

88
//sdk版本
99
compileSdkVersion: 26,

item-touch-move-helper/src/main/java/com/dyhdyh/helper/itemtouch/ItemTouchMoveHelper.java

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package com.dyhdyh.helper.itemtouch;
22

3-
import android.content.Context;
43
import android.support.v7.widget.RecyclerView;
5-
import android.view.GestureDetector;
4+
import android.util.Log;
65
import android.view.MotionEvent;
76
import android.view.View;
87

@@ -13,58 +12,52 @@
1312
* created 2018/4/8 14:24
1413
*/
1514
public class ItemTouchMoveHelper {
16-
private boolean mItemTouchMoveEnable;
17-
18-
private GestureDetector mGestureDetector;
15+
private boolean mInterceptEnable;
1916
private OnItemTouchMoveListener mOnItemTouchMoveListener;
2017

21-
public ItemTouchMoveHelper(Context context) {
22-
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
23-
@Override
24-
public void onLongPress(MotionEvent e) {
25-
//长按触发开启
26-
mItemTouchMoveEnable = true;
27-
}
28-
});
29-
}
18+
public boolean onTouchEvent(RecyclerView rv, MotionEvent e) {
19+
if (!mInterceptEnable) {
20+
return false;
21+
}
3022

31-
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
32-
mGestureDetector.onTouchEvent(e);
33-
return mItemTouchMoveEnable;
34-
}
23+
Log.d("ItemTouchMoveHelper", "onTouchEvent----->" + e);
3524

36-
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
3725
View childView = rv.findChildViewUnder(e.getX(), e.getY());
3826
if (childView == null) {
39-
callCancelItemTouchMove(false, null, -1, e);
40-
return;
27+
if (mOnItemTouchMoveListener != null) {
28+
mOnItemTouchMoveListener.onItemTouchMove(false, null, -1, e);
29+
return true;
30+
}
4131
}
4232

4333
int childPosition = rv.getChildLayoutPosition(childView);
4434
if (childPosition < 0) {
45-
return;
35+
if (mOnItemTouchMoveListener != null) {
36+
mOnItemTouchMoveListener.onItemTouchMove(false, null, -1, e);
37+
return true;
38+
}
4639
}
4740

4841
if (e.getAction() == MotionEvent.ACTION_DOWN || e.getAction() == MotionEvent.ACTION_MOVE) {
49-
//判断位置 防止多次回调
5042
if (mOnItemTouchMoveListener != null) {
5143
mOnItemTouchMoveListener.onItemTouchMove(true, childView, childPosition, e);
44+
return true;
5245
}
5346
} else if (e.getAction() == MotionEvent.ACTION_UP) {
54-
callCancelItemTouchMove(true, childView, childPosition, e);
47+
if (mOnItemTouchMoveListener != null) {
48+
mOnItemTouchMoveListener.onItemTouchMove(true, childView, childPosition, e);
49+
return true;
50+
}
5551
}
52+
return false;
5653
}
5754

58-
private void callCancelItemTouchMove(boolean isTouchChild, View childView, int childPosition, MotionEvent e) {
59-
mItemTouchMoveEnable = false;
60-
//抬起时还原
61-
if (mOnItemTouchMoveListener != null) {
62-
mOnItemTouchMoveListener.onItemTouchMove(isTouchChild, childView, childPosition, e);
63-
}
55+
public void setOnItemTouchMoveListener(OnItemTouchMoveListener onItemTouchMoveListener) {
56+
this.mOnItemTouchMoveListener = onItemTouchMoveListener;
6457
}
6558

66-
public void setOnItemTouchMoveListener(OnItemTouchMoveListener listener) {
67-
this.mOnItemTouchMoveListener = listener;
59+
public void setInterceptEnable(boolean interceptEnable) {
60+
this.mInterceptEnable = interceptEnable;
6861
}
6962

7063
/**
Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,42 @@
11
package com.dyhdyh.helper.itemtouch;
22

3-
import android.content.Context;
43
import android.support.v7.widget.RecyclerView;
54
import android.view.MotionEvent;
65
import android.view.View;
76

87
/**
9-
* 简单的滑动触摸监听
8+
* 普通的滑动触摸监听
109
*
1110
* @author dengyuhan
1211
* created 2018/4/8 14:22
1312
*/
14-
public class SimpleItemTouchMoveListener extends RecyclerView.SimpleOnItemTouchListener implements OnItemTouchMoveListener {
13+
public abstract class SimpleItemTouchMoveListener extends RecyclerView.SimpleOnItemTouchListener implements OnItemTouchMoveListener {
1514
private ItemTouchMoveHelper mItemTouchMoveHelper;
1615

17-
public SimpleItemTouchMoveListener(Context context) {
18-
mItemTouchMoveHelper = new ItemTouchMoveHelper(context);
16+
public SimpleItemTouchMoveListener() {
17+
mItemTouchMoveHelper = new ItemTouchMoveHelper();
1918
mItemTouchMoveHelper.setOnItemTouchMoveListener(this);
2019
}
2120

2221
@Override
2322
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
24-
return mItemTouchMoveHelper.onInterceptTouchEvent(rv, e);
23+
mItemTouchMoveHelper.setInterceptEnable(onInterceptEnable());
24+
if (mItemTouchMoveHelper.onTouchEvent(rv, e)) {
25+
return true;
26+
}
27+
return false;
2528
}
2629

2730
@Override
2831
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
32+
mItemTouchMoveHelper.setInterceptEnable(onInterceptEnable());
2933
mItemTouchMoveHelper.onTouchEvent(rv, e);
3034
}
3135

3236
@Override
3337
public void onItemTouchMove(boolean isTouchChild, View childView, int childPosition, MotionEvent event) {
3438

3539
}
40+
41+
public abstract boolean onInterceptEnable();
3642
}

item-touch-move-helper/src/main/java/com/dyhdyh/helper/itemtouch/simple/SimpleMovePreviewListener.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.dyhdyh.helper.itemtouch.simple;
22

3-
import android.content.Context;
3+
import android.support.v4.view.GestureDetectorCompat;
4+
import android.support.v7.widget.RecyclerView;
5+
import android.util.Log;
6+
import android.view.GestureDetector;
47
import android.view.MotionEvent;
58
import android.view.View;
69

@@ -15,11 +18,27 @@
1518
*/
1619
public class SimpleMovePreviewListener extends SimpleItemTouchMoveListener {
1720
private int mLastPosition = -1;
21+
private boolean mPreviewEnable;//开启预览
22+
private GestureDetectorCompat mGestureDetector;
1823
private OnMovePreviewListener mOnMovePreviewListener;
1924

20-
public SimpleMovePreviewListener(Context context, OnMovePreviewListener listener) {
21-
super(context);
25+
public SimpleMovePreviewListener(RecyclerView rv, OnMovePreviewListener listener) {
2226
this.mOnMovePreviewListener = listener;
27+
this.mGestureDetector = new GestureDetectorCompat(rv.getContext(), new GestureDetector.SimpleOnGestureListener() {
28+
@Override
29+
public void onLongPress(MotionEvent e) {
30+
//长按开启预览
31+
mPreviewEnable = true;
32+
onTouchEvent(rv, e);
33+
}
34+
});
35+
}
36+
37+
@Override
38+
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
39+
mGestureDetector.onTouchEvent(e);
40+
Log.d("Intercept------>", e.getAction() + " " + mPreviewEnable);
41+
return super.onInterceptTouchEvent(rv, e);
2342
}
2443

2544
@Override
@@ -38,9 +57,15 @@ public void onItemTouchMove(boolean isTouchChild, View childView, int childPosit
3857
} else {
3958
//手指抬起时取消
4059
mLastPosition = -1;
60+
mPreviewEnable = false;
4161
if (mOnMovePreviewListener != null) {
4262
mOnMovePreviewListener.onCancelPreview();
4363
}
4464
}
4565
}
66+
67+
@Override
68+
public boolean onInterceptEnable() {
69+
return mPreviewEnable;
70+
}
4671
}

0 commit comments

Comments
 (0)