场景再现
布局分析
外层是一个RecyclerView,每个Item中又有一个可以上下滑动的RecyclerView,这种计划表里层肯定会造成滑动辩说,编码完成的时间表现就是,内部的 RecyclerView是无法滑动的,就现在的题目实验着处置惩罚一下。
办理方法具体步骤如下:
- 步骤一:使用赤色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) { } });
- 步骤二:在工具类的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上的时间不做处置惩罚
终极展示结果
|