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)
}
我有带 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)
}