如果滚动位置为 0,ViewPager2 中的片段不会响应点击
Fragments in ViewPager2 does not respond to clicks if scroll position is 0
很高兴Google发布了ViewPager2,它基于RecyclerView构建,解决了旧ViewPager存在的许多问题。
我很快将旧的 ViewPager 代码替换为 ViewPager2:
将 xml
中的 ViewPager 替换为 ViewPager2
将FragmentPagerAdapter(FragmentManager)
替换为FragmentStateAdapter(Fragment)
ViewPager设置如下:
viewPager.adapter = fragmentAdapter
val mediator = TabLayoutMediator(tabLayout, viewPager, true) { tab, position ->
tab.text = fragmentAdapter.tabNames[position]
}
mediator.attach()
没有进行其他更改。
问题
执行上述更改后,我意识到一个问题 -
现在我的 ViewPager 是一个普通的水平分页器,我的 fragmentAdapter
中的每个片段都有一个垂直的 RecyclerView
。
我观察到,当RecyclerView的滚动位置为0时,我在RecyclerView中的项目无法接收到任何点击或长按事件,但可以滚动。滚动后,可以再次收到点击。*
知道ViewPager2
也是一个RecyclerView
,是不是和嵌套的RecyclerView有关系?
事实证明这可能是 ConstraintLayout
或 ViewPager2
中的错误。
ViewPager2
的容器本来是一个ConstraintLayout
,我改成LinearLayout
后就可以了
我试图在示例项目中重现该问题,但即使我使用 ConstraintLayout
也无法重现...所以必须有一些其他条件才能实现。
很高兴Google发布了ViewPager2,它基于RecyclerView构建,解决了旧ViewPager存在的许多问题。
我很快将旧的 ViewPager 代码替换为 ViewPager2:
将 xml
中的 ViewPager 替换为 ViewPager2
将
FragmentPagerAdapter(FragmentManager)
替换为FragmentStateAdapter(Fragment)
ViewPager设置如下:
viewPager.adapter = fragmentAdapter val mediator = TabLayoutMediator(tabLayout, viewPager, true) { tab, position -> tab.text = fragmentAdapter.tabNames[position] } mediator.attach()
没有进行其他更改。
问题
执行上述更改后,我意识到一个问题 -
现在我的 ViewPager 是一个普通的水平分页器,我的 fragmentAdapter
中的每个片段都有一个垂直的 RecyclerView
。
我观察到,当RecyclerView的滚动位置为0时,我在RecyclerView中的项目无法接收到任何点击或长按事件,但可以滚动。滚动后,可以再次收到点击。*
知道ViewPager2
也是一个RecyclerView
,是不是和嵌套的RecyclerView有关系?
事实证明这可能是 ConstraintLayout
或 ViewPager2
中的错误。
ViewPager2
的容器本来是一个ConstraintLayout
,我改成LinearLayout
后就可以了
我试图在示例项目中重现该问题,但即使我使用 ConstraintLayout
也无法重现...所以必须有一些其他条件才能实现。