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

ale*_*spb 2 android android-fragments android-viewpager android-tablayout android-viewpager2

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

 viewPager.currentItem = selectedTabPosition
Run Code Online (Sandbox Code Playgroud)

此代码选择选项卡,但在其中打开第一个选项卡的片段!仅当我通过点击来选择选项卡时 - 我才能在每个选项卡中看到正确的片段。我也尝试使用 Tablayout 进行选择,如下所示:

tabLayout.getTabAt(position)?.select()
Run Code Online (Sandbox Code Playgroud)

但这段代码没有帮助,也可以解决这个错误。我也尝试过设置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
}
Run Code Online (Sandbox Code Playgroud)

适配器代码

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
    }
}
Run Code Online (Sandbox Code Playgroud)

其中 ViewPager2TitleAdapter 是:

abstract class ViewPager2TitleAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {
abstract fun getPageTitle(position: Int): Int?
Run Code Online (Sandbox Code Playgroud)

DocumentListFragment在其中根据参数对象创建视图。

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


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

在此输入图像描述

ale*_*spb 6

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

it.setCurrentItem(params.pageType.ordinal, false)
Run Code Online (Sandbox Code Playgroud)

但我是这样做的:

it.currentItem = params.pageType.ordinal
Run Code Online (Sandbox Code Playgroud)

在这种情况下,布尔值false发挥了魔力 - 它禁用平滑滚动。我从这个关于 ViewPager2 的答案中得到了它:

/sf/answers/4712389321/