RecyclerView给item添加事件致使自己的onTouch事件的down没法捕捉解决

需求

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

误区

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

解决方案

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

在网上搜寻过各类方法,如在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;
            }
复制代码
相关文章
相关标签/搜索