ViewPager2 selectCurrentItem - select 选项卡,但在此选项卡中放置了错误的片段

ViewPager2 selectCurrentItem - select Tab, but place wrong Fragment inside this tab

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

 viewPager.currentItem = selectedTabPosition

此代码 select 选项卡,但其中是第一个选项卡的打开片段!只有当我 select 通过点击选项卡时 - 我可以在每个选项卡中看到正确的片段。 我也尝试 select 像这样使用 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 在里面根据参数对象创建视图。

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


最后但并非最不重要 - 当我尝试打开屏幕外的选项卡时(我有可滚动的选项卡) - viewPager 打开 selected 选项卡,上面有正确的片段..因此,仅当我尝试打开屏幕上显示的前 4 个选项卡(查看图像)时才会出现问题。从 5 个和下一个选项卡开始的位 - selected 正确。

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

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

但我是这样做的:

it.currentItem = params.pageType.ordinal

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

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

viewPager.post {
   viewPager.setCurrentItem(1, true)
}