RecyclerView的item中嵌套RecyclerView的滑动冲突处理

场景再现

GIF.gif

布局分析

无标题.png

外层是一个RecyclerView,每个Item中又有一个可以上下滑动的RecyclerView,这种设计内外层肯定会造成滑动冲突,编码完成的时候表现就是,内部的 RecyclerView是无法滑动的,就目前的问题尝试着处理一下。

解决方法具体步骤如下:

  1. 步骤一:利用红色Recycleview的addOnItemTouchListener 函数监听touchEvent获取event坐标点,给ViewHolder判断是否请求不拦截
红色.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
            @Override
            public boolean onInterceptTouchEvent(RecyclerView rv,MotionEvent e) {
                //处理RecyclerView的item中嵌套RecyclerView的滑动冲突解决
                View childViewUnder = 红色.findChildViewUnder(e.getX(), e.getY());
                if (rv != null && childViewUnder != null){
                    BaseViewHolder baseViewHolder = (BaseViewHolder)rv.getChildViewHolder(childViewUnder);
                    红色.requestDisallowInterceptTouchEvent(Utils.isTouchValue(baseViewHolder.getView(R.id.蓝色),e.getRawX(),e.getRawY()));
                }
                return false;
            }

            @Override
            public void onTouchEvent(RecyclerView rv,MotionEvent e) {

            }

            @Override
            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

            }
        });
  1. 步骤二:在工具类的Utils中的isTouchValue函数,判断event坐标点是否在蓝色Recycleview范围内
/**
     *
     * @param x event的rowX
     * @param y event的rowY
     * @return 这个点在不在内部RecycleView范围内.
     */
    public static boolean isTouchValue(RecyclerView recyclerView,float x, float y) {
        int[] wh= new int[2];
        //触摸在屏幕上的位置
        recyclerView.getLocationOnScreen(pos);
        int width = recyclerView.getMeasuredWidth();
        int height = recyclerView.getMeasuredHeight();
        return x >= wh[0] && x <= wh[0] + width && y >= wh[1] && y <= wh[1] + height;
    }

这样在滑动位置处于内部Recycleview上的时候,event就被传到了内部Recycleview中,触发内部Recycleview的滑动.不在内部Recycleview上的时候不做处理

最终展示效果

GIF.gif

你可能感兴趣的:(RecyclerView的item中嵌套RecyclerView的滑动冲突处理)