我在尝试控制RecycleView中的触摸事件传播时遇到了一些问题.所以我有一个RecyclerView填充一组模仿卡片堆栈的CardView(因此它们相互重叠并具有一定的位移,尽管它们具有不同的高程值).我目前的问题是每张卡都有一个按钮,因为相对卡位移小于按钮的高度,导致按钮重叠的情况,每当调度触摸事件时,它开始从视图层次结构的底部传播(来自儿童)最高的孩子数).
根据我读过的文章(这个,这个和这个视频),触摸传播取决于父视图中的视图顺序,因此触摸将首先传递给具有最高索引的子项,而我希望仅处理触摸事件通过最顶层视图和RecyclerView的可触摸(它还必须处理拖动和拖动手势).目前我正在使用卡片,这些卡片知道他们在父视图层次结构中的位置,以防止错误的孩子处理触摸,但这是非常难看的方式.我的假设是我必须覆盖RecyclerView的dispatchTouchEvent方法,并且只将触摸事件正确地发送给最顶层的子节点.但是,当我尝试这种方式时(这也有点笨拙):
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
View topChild = getChildAt(0);
for (View touchable : topChild.getTouchables()) {
int[] location = new int[2];
touchable.getLocationOnScreen(location);
RectF touchableRect = new RectF(location[0],
location[1],
location[0] + touchable.getWidth(),
location[1] + touchable.getHeight());
if (touchableRect.contains(ev.getRawX(), ev.getRawY())) {
return touchable.dispatchTouchEvent(ev);
}
}
return onTouchEvent(ev);
}
Run Code Online (Sandbox Code Playgroud)
只有DOWN事件被传递到卡内的按钮(没有触发点击事件).我将非常感谢有关扭转触摸事件传播顺序或将触摸事件委托给特定视图的方法的任何建议.非常感谢你提前.
编辑:这是示例卡堆栈的样子的截图

示例适配器代码:
public class TestAdapter extends RecyclerView.Adapter {
List<Integer> items;
public TestAdapter(List<Integer> items) {
this.items = items;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int …Run Code Online (Sandbox Code Playgroud)