ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段

Posted

技术标签:

【中文标题】ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段【英文标题】:ViewPager2 selectCurrentItem - select Tab, but place wrong Fragment inside this tab 【发布时间】:2021-07-21 18:52:46 【问题描述】:

我有带有 Tablayout 的基本 ViewPager2 - 在每个页面中我都有不同的片段。 当我需要不是从第一个(默认)选项卡打开此视图时,我正在这样做:

 viewPager.currentItem = selectedTabPosition

此代码选择选项卡,但里面是从第一个选项卡打开的片段!只有当我通过点击它来选择标签时 - 我才能在每个标签中看到正确的片段。 我也尝试过像这样使用 Tablayout 进行选择:

tabLayout.getTabAt(position)?.select()

但是这段代码没有帮助,也可以解决这个错误。 我也尝试将viewPager.currentItem 设置为post / postDelay - 但这也不起作用。

也许我失去了一些东西?或者它是 ViewPager2 中的一个错误?

(编辑 - ViewPager 代码)

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) 
    super.onViewCreated(view, savedInstanceState)

    setupPagerAdapter()


private fun setupPagerAdapter() 
    val adapter = MainDocumentScreenPagerAdapter(this)

    binding?.viewPager?.letUnit 
        it.adapter = adapter
        binding?.tabsPagerView?.attachViewPager(requireContext(), it, adapter)

        // set tab
        it.currentItem = params.pageType.ordinal

适配器代码

class MainDocumentScreenPagerAdapter (fragment: Fragment) : ViewPager2TitleAdapter(fragment) 

override fun getItemCount(): Int = DocumentPageType.values().size

override fun createFragment(position: Int): Fragment 
    val pageType = DocumentPageType.values().firstOrNull  it.ordinal == position  ?: throw IllegalStateException()

    val params = DocumentListFragment.createParams(pageType)
    return DocumentListFragment.newInstance(params)


override fun getPageTitle(position: Int): Int? 
    return when (position) 
        DocumentPageType.ALL.ordinal -> DocumentPageType.ALL.title
        DocumentPageType.SIGN.ordinal -> DocumentPageType.SIGN.title
        DocumentPageType.ACCEPT.ordinal -> DocumentPageType.ACCEPT.title
        DocumentPageType.CONFIRM.ordinal -> DocumentPageType.CONFIRM.title
        DocumentPageType.REJECT.ordinal -> DocumentPageType.REJECT.title
        else -> null
    

ViewPager2TitleAdapter 在哪里:

abstract class ViewPager2TitleAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) 
abstract fun getPageTitle(position: Int): Int?

DocumentListFragment 在其中创建视图,基于 param 对象。

我也尝试在 OnCreate 中创建适配器 - 但它不会影响这种情况。


最后但并非最不重要的一点 - 当我尝试打开屏幕外的选项卡时(我有可滚动的选项卡) - viewPager 打开带有正确片段的选定选项卡。所以,问题仅发生在我尝试打开屏幕上显示的前 4 个选项卡(看图片)。从 5 和下一个选项卡开始的位 - 已选择正确。

【问题讨论】:

请求显示如何设置和创建viewpager2的代码的正确方法 @Andrew 我添加了代码 仍然需要适配器设置,即MainDocumentScreenPagerAdapter中的内容 @Andrew 完成了???? 【参考方案1】:

所以,决定就在这行代码中:

it.setCurrentItem(params.pageType.ordinal, false)

但我是这样做的:

it.currentItem = params.pageType.ordinal

boolean false 在这种情况下变魔术 - 它禁用平滑滚动。我从这个关于 ViewPager2 的答案中得到了它:

https://***.com/a/67319847/4809482

【讨论】:

【参考方案2】:

我认为更简单更可靠的解决方法是推迟到下一个运行周期而不是不安全的延迟,例如

viewPager.post 
   viewPager.setCurrentItem(1, true)

【讨论】:

以上是关于ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段的主要内容,如果未能解决你的问题,请参考以下文章

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2+Fragment操作笔记

ViewPager2嵌套RecyclerView滑动冲突解决办法

无法使用数据绑定绑定 viewpager2 数据

ViewPager2学习总结