我有一个ViewPager2,里面有片段。
其中一个片段有2个RecyclerViews,这两个视图都是水平线性的。
当您触摸回收站视图时,视图寻呼机会处理滑动手势,并且不会滚动回收站视图。
RecyclerViews和ViewPenger都在NestedScrollView中,但这不会改变任何事情。
滚动回收站视图的唯一方法是在回收站视图上做一个缓慢的滑动手势,这样,回收站视图处理滑动手势而不是视图,但当然,这对用户来说不方便。
如何使回收器视图在触摸时处理滚动,并在触摸在回收器视图内时禁用视图寻呼机的处理。
P. S:我知道大多数人会说不推荐,谷歌应用商店有相同的视图,但是ViewPenger不可滚动,相反,用户应该使用TabLayout来导航页面。
这是我为我的案例定义的,可以动态应用于ViewPage2中的任何回收器视图
public void controlHorizontalScrollingInViewPager2(RecyclerView recyclerView, ViewPager2 viewPager2) {
RecyclerView.OnItemTouchListener onTouchListener = new RecyclerView.OnItemTouchListener() {
int lastX = 0;
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = (int) e.getX();
break;
case MotionEvent.ACTION_MOVE:
boolean isScrollingRight = e.getX() < lastX;
if ((isScrollingRight && ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition() == recyclerView.getAdapter().getItemCount() - 1) ||(!isScrollingRight && ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0)) {
viewPager2.setUserInputEnabled(true);
} else {
viewPager2.setUserInputEnabled(false);
}
break;
case MotionEvent.ACTION_UP:
lastX = 0;
viewPager2.setUserInputEnabled(true);
break;
}
return false;
}
@Override
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
};
recyclerView.addOnItemTouchListener(onTouchListener);
}
用法:
controlHorizontalScrollingInViewPager2(yourRecyclerView,mViewPager2);
查看此处报告的类似问题ViewPager2,其中包含水平滚动视图
我在所有可能的网站上搜索了很长时间来寻找这个问题的解决方案,但我不得不尝试并编写自己的代码。
请在下面尝试kotlin
recyclerView.addOnItemTouchListener(object : RecyclerView.OnItemTouchListener {
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
when (e.action) {
MotionEvent.ACTION_MOVE -> viewPager2!!.isUserInputEnabled = false
else -> viewPager2!!.isUserInputEnabled = true
}
return false
}
override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
TODO("Not yet implemented")
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
TODO("Not yet implemented")
}
fun ViewPager2.reduceDragSensitivity() {
val recyclerViewField = ViewPager2::class.java.getDeclaredField("mRecyclerView")
recyclerViewField.isAccessible = true
val recyclerView = recyclerViewField.get(this) as RecyclerView
val touchSlopField = RecyclerView::class.java.getDeclaredField("mTouchSlop")
touchSlopField.isAccessible = true
val touchSlop = touchSlopField.get(recyclerView) as Int
touchSlopField.set(recyclerView, touchSlop*8) // "8" was obtained experimentally
}
上述代码会降低< code > view page 2 的敏感度。以下是文章来源:https://al-e-shevelev . medium . com/how-to-reduce-scroll-sensitivity-of-view page 2-widget-87797 ad 02414