美文网首页android View简化开发
RecyclerView的item中嵌套RecyclerView

RecyclerView的item中嵌套RecyclerView

作者: HMZZS | 来源:发表于2022-06-10 17:31 被阅读0次

    场景再现

    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

        本文链接:https://www.haomeiwen.com/subject/lpebmrtx.html