RecyclerView onTouch & onClick 触摸事件与点击事件

遇到一种情况需要处理,RecyclerView所在Activity需要处理滑动事件用于返回(onBackPressed)。

手势检测:

 1  @Override
 2     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
 3                            float velocityY) {
 4         LogUtil.d(this,"fling");
 5         if (e1.getX() - e2.getX() > verticalMinDistance
 6                 && Math.abs(velocityX) > minVelocity) {
 7             LogUtil.d(this, "fling left");
 8             return true;
 9         } else if (e2.getX() - e1.getX() > verticalMinDistance
10                 && Math.abs(velocityX) > minVelocity) {
11             LogUtil.d(this, "fling right");
12             activity.onBackPressed();
13             return true;
14         }
15         return false;
16     }
17 
18     @Override
19     public boolean onDown(MotionEvent e) {
20         LogUtil.d(this, "Down");
21         return false;
22     }
23 
24     @Override
25     public boolean onScroll(MotionEvent e1, MotionEvent e2,
26                             float distanceX, float distanceY) {
27         LogUtil.d(this, "scroll");
28         return false;
29     }

此处需要注意,onDown不能直接处理成true(开始就坑在这里,完全按普通触摸事件处理成返回true,导致click事件永远不会得到事件触发)

虽然官方文档建议处理触摸事件时,要将其置成true,表示开始处理触摸。但因为我们还有itemView的click事件要处理,所以onDown不能直接返回true.

绑定触摸事件:

 1  view.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
 2             @Override
 3             public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
 4                 LogUtil.d("Base RecyclerView Event", "Touch");
 5                 mDetector.onTouchEvent(e);
 6                 return false;
 7             }
 8 
 9             @Override
10             public void onTouchEvent(RecyclerView rv, MotionEvent e) {
11 
12             }
13 
14             @Override
15             public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
16 
17             }
18         });



原文地址:https://www.cnblogs.com/dev2007/p/5173183.html