RecyclerView给item添加事件导致本身的onTouch事件的down无法捕捉解决

1,977 阅读1分钟

需求

这几天在用android做网易云的歌单效果,大致需求是一个全屏的activity,上面是一个LinearLayout,下面是RecyclerView,然后滑动RecylerView整体移动LinearLayout和RecylerView,当LinearLayout移动到顶端的时候不再继续移动,而是滚动RecylerView

误区

第一想法在RecylerView上添加onTouchEventListener,但是这样就会有一个问题,当在RecylerView的item上添加事件时,RecylerView将无法捕获到TouchDown

解决方案

出现这种状况的原因主要是子控件的事件处理消费掉了这个事件,不让其继续传播

在网上搜寻过各种方法,如在item的根布局上添加android:descendantFocusability="blocksDescendants",设置点击控件的cclickable和focusable为true,都无法解决,最后的解决方案是不用根布局的onTouchEventListener,改用addOnItemTouchListener,addOnItemTouchListener可以在点击item的时候拦截掉这个点击事件。

代码展示

songList.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            private int startY;
            @Override
            public boolean onInterceptTouchEvent(@NonNull RecyclerView recyclerView, @NonNull MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        startY = (int) event.getRawY();
                        break;
                    case MotionEvent.ACTION_MOVE:
                        int moveY = (int) event.getRawY();
                        //拿到手指移动距离的大小
                        int move_bigY = moveY - startY;
                        //拿到当前控件未移动的坐标
                        int top = contentMain.getTop();
                        top += move_bigY;
                        if (top > 0 || top < limitTop) {
                            return false;
                        }
                        contentMain.layout(contentMain.getLeft(), top, contentMain.getRight(), contentMain.getBottom());
                        startY = moveY;
                        break;
                }
                return false;
            }