首页 > 解决方案 > 带有 FragmentStateAdapter 嵌套滚动问题的 ViewPager2

问题描述

我已经使用 和 Fragments 设置了我的活动ViewPager2布局BottomNavigationView。在我的第一个片段中ViewPager2包含一个ImageSlider.

当我滚动 ImageSlider 时,整个片段(在 中ViewPager2)滚动到第二个片段。为什么会这样?

然后我改为 NormalViewPager而不是ViewPager2FragmentPagerAdapter而不是FragmentStateAdapter,它完美地工作,不幸FragmentPagerAdapter的是被弃用了。?

布局

 <androidx.viewpager2.widget.ViewPager2
    android:id="@+id/viewPager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

活动

val adapter = ViewPagerAdapter(this)
viewPager.adapter = adapter
    

ViewPagerAdapter

const val FRAGMENT_COUNT = 4;

class ViewPagerAdapter(activity: FragmentActivity): FragmentStateAdapter(activity){

override fun getItemCount() = FRAGMENT_COUNT

override fun createFragment(position: Int): Fragment {
    return when(position) {
        0 -> HomeFragment()
        1 -> DepartmentFragment()
        2 -> ConnectFragment()
        3 -> SocialFragment()
        else -> HomeFragment()
    }
  }
}

标签: androidandroid-fragmentsfragmentstatepageradapterandroid-viewpager2fragmentstateadapter

解决方案


拦截 ViewPager2 触摸监听器是不可能的,因为我们不能像在 ViewPager 中那样扩展它,因为这个 viewpager 不允许任何嵌套视图滚动。因此,您需要在 viewpager2 周围编写一个包装视图,该视图将处理此触摸拦截器并允许其他视图接收滚动。

签出 Google ViewPager2 示例中的NestedTabSroller类。这堂课会解决你的问题


推荐阅读