RecyclerView的item中嵌套Scrollview的滑动冲突解决场景
外层是一个RecyclerView rv ,每个Item中又有一个可以上下滑动的Scrollview sv
解决方法
1、rv addOnItemTouchListener 监听touchEvent获取event坐标点,给ViewHolder判断是否请求不拦截.
rv addOnItemTouchListener 监听touchEvent获取event坐标点,给ViewHolder判断是否请求不拦截.
rv.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onTouchEvent(rv: RecyclerView?, e: MotionEvent?) {
}
override fun onInterceptTouchEvent(rv: RecyclerView?, e: MotionEvent?): Boolean {
if (e != null) {
//找到被点击位置的item的rootView
val view = rv?.findChildViewUnder(e.x, e.y)
if (view != null) {
//通过rootView找到对应的ViewHolder
val holder = rv.getChildViewHolder(view) as CombineAdapter.ViewHolder
//由ViewHolder决定要不要请求不拦截,如果不拦截的话event就回一路传到rootView中.否则被rv消费.
rv.requestDisallowInterceptTouchEvent(holder.isTouchNsv(e.rawX, e.rawY))
}
}
return false
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
}
})
2、判断event坐标点是否在sv范围内:
/**
*
* @param x event的rowX
* @param y event的rowY
* @return 这个点在不在sv的范围内.
*/
public boolean isTouchNsv(float x,float y) {
int[] pos = new int[2];
//获取sv在屏幕上的位置
mall_nsv.getLocationOnScreen(pos);
int width = mall_nsv.getMeasuredWidth();
int height = mall_nsv.getMeasuredHeight();
return x >= pos[0] && x <= pos[0] + width && y >= pos[1] && y <= pos[1] + height;
}
这样在滑动位置处于sv上的时候,event就被传到了sv中,触发sv的滑动.不在sv上的时候不做处理,触发rv的滑动。
总结:父布局onInterceptTouchEvent中判断要拦截或者不要拦截的事件区域。
网友评论