问题是我们需要禁用嵌套滚动ViewPager2
,但是android:nestedScrollingEnabled="false"
不起作用,因为ViewPager2
正在内部使用RecyclerView
具有嵌套滚动的效果。
因此,您需要禁用嵌套滚动ViewPager
RecyclerView
.
主要问题是RecyclerView
of ViewPager2
默认情况下不可访问。
2022 年 2 月更新
添加更好的访问方式RecyclerView
of the ViewPager2
而不是使用反射:
Kotlin:
viewPager2.children.find { it is RecyclerView }?.let {
(it as RecyclerView).isNestedScrollingEnabled = false
}
Java:
for (int i = 0; i < viewPager2.getChildCount(); i++) {
View child = mViewPager.getChildAt(i);
if (child instanceof RecyclerView)
((RecyclerView) child).setNestedScrollingEnabled(false);
}
这应该可行,但如果仍然遇到问题,请尝试禁用滚动模式RecyclerView
:
// Kotlin
recyclerView?.overScrollMode = View.OVER_SCROLL_NEVER // Optional
// Java
recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); // Optional
Preview:
With Reflections
----
您可以使用以下方式访问它java反射.
这需要知道名称字段RecyclerView
可以在ViewPager2定义类是mRecyclerView
将其组合在一个辅助函数中:
public static RecyclerView getRecyclerView(ViewPager2 viewPager) {
try {
Field field = ViewPager2.class.getDeclaredField("mRecyclerView");
field.setAccessible(true);
return (RecyclerView) field.get(viewPager);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
然后您可以禁用嵌套滚动,如下所示:
RecyclerView recyclerView = getRecyclerView(viewPager);
if (recyclerView != null)
recyclerView.setNestedScrollingEnabled(false);
recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER);
对于 Kotlin 用户:
扩展功能:
fun ViewPager2.getRecyclerView(): RecyclerView? {
try {
val field = ViewPager2::class.java.getDeclaredField("mRecyclerView")
field.isAccessible = true
return field.get(this) as RecyclerView
} catch (e: NoSuchFieldException) {
e.printStackTrace()
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
return null
}
及用法:
val recyclerView = viewPager.getRecyclerView()
recyclerView?.isNestedScrollingEnabled = false
recyclerView?.overScrollMode = View.OVER_SCROLL_NEVER // Optional