我在复杂的层次结构中有一个水平的RecyclerView,它看起来像这样-
<ViewPager id="+@id/first">
<ViewPager id="+@id/second"> this viewpager is taking away the scroll event
<SwipeToRefreshLayout>
<RecyclerView> //this one is vertical
<RecyclerView id="@id/rv1"> //this one is horizontal
<RecyclerView id="@id/rv2"> //this one is working fine (different type)
</RecyclerView>
</SwipeToRefreshLayout>
</ViewPager>
</ViewPager>
现在的问题是第二个ViewPager正在从“水平RV”劫持滚动。该垂直RV中有2种类型的水平RV(RV1和RV2)。但是其中只有一个(RV1)面临此问题。第二个(RV2)工作正常。 另外,当我按住时,滚动效果很好。并且当RV1已经滚动并且尚未稳定时,滚动也可以正常工作。 我提到了其他有关设置nestedScrolling为false的答案。似乎什么都没用。
答案 0 :(得分:7)
您可以通过重写onInterceptTouchEvent方法来实现:
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
rv.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
@Override
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
答案 1 :(得分:1)
此答案是@Astril Veliy答案的科特林版本
yourRecyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
when (e.action) {
MotionEvent.ACTION_DOWN -> {
yourRecyclerView.parent?.requestDisallowInterceptTouchEvent(true)
}
}
return false
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {}
})
答案 2 :(得分:0)
视图分页器视图和水平回收器视图都将水平滚动,因此系统很难找出要滚动的页面,因此您需要使用不具备滑动功能的视图分页器来代替第二个视图分页器,请检查this答案有关如何使用不可滑动查看的寻呼机的信息。