场景再现
布局分析
外层是一个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上的时候不做处理
最终展示效果