【问题标题】:Handling TouchEvents on RecyclerView在 RecyclerView 上处理 TouchEvents
【发布时间】:2018-07-25 12:38:55
【问题描述】:

我有这段代码实现了RecyclerView,我想添加一些手势。我想做两件事,但我不知道,因为我是新手。

  1. 当有人点击 RecyclerView 时,我想在进入回收站之前从 Activity 捕获事件。这就是我从 dispatchTouchEvent 返回 true 的原因。但它不起作用,因为调用了 onTouch。

  2. 如果我们允许事件向下传递,当触摸事件进入回收器(OnTouch 方法)时,ActivityonTouchEvent 不会被调用。它应该被调用,因为事件处理冒泡了。

    public class MainActivity extends AppCompatActivity implements View.OnTouchListener{
    
    private RecyclerView recyclerView;
    private GestureDetectorCompat detector;
    
    @Override
    protected void onCreate(Bundle savedInstanceState)  {
    
        super.onCreate(savedInstanceState);
    
        detector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() {
    
            @Override
            public boolean onFling (MotionEvent e1, MotionEvent e2,float velocityX,
            float velocityY){
                return false;
            }
    
        });
    
        recyclerView.setOnTouchListener(this);
    
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return detector.onTouchEvent(event);
    }
    
    @Override
    public boolean onTouch(View v,MotionEvent event) {
        return detector.onTouchEvent(event);
    }
    
    @Override
        public boolean dispatchTouchEvent(MotionEvent ev){
        super.dispatchTouchEvent(ev);
        return true;
    }
    }
    

【问题讨论】:

  • 在activity中捕捉到一个touch事件后你想做什么?

标签: android android-recyclerview android-event android-touch-event


【解决方案1】:

你不想让回收站视图吃掉事件,那么你有两种方式

这就是我从 dispatchTouchEvent 返回 true 的原因

  1. 从 dispatchTouchEvent 返回 false,当您在 recyclerView 中执行此操作时,不会调用 recyclerView 子级的 dispatchTouchEvent(),因此事件甚至不会下降,因此不会发生冒泡。这意味着 recyclerView 或其任何子级的 onTouch/onTouchEvent 也将被调用。将直接调用 Activity 上的 onTouch。

  2. 从 onTouch() 返回 false 在这种情况下,事件将下降到所有子视图,如果它们没有被消耗,那么将到达回收器视图,你是否从这里返回 false然后会调用Activity的onTouch。

注意: 所以你必须选择一个你不能同时拥有的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2012-08-20
    • 2016-09-23
    相关资源
    最近更新 更多