如何解决ViewPager2 selectCurrentItem - 选择 Tab,但在这个 tab 中放置了错误的 Fragment
我有带有 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 个和下一个选项卡开始的位 - 选择正确。
解决方法
所以,决定就在这行代码中:
it.setCurrentItem(params.pageType.ordinal,false)
但我是这样做的:
it.currentItem = params.pageType.ordinal
boolean false
在这种情况下变魔术 - 它禁用平滑滚动。我从这个关于 ViewPager2 的答案中得到了它:
https://stackoverflow.com/a/67319847/4809482
,我认为更简单更可靠的解决方法是推迟到下一个运行周期而不是不安全的延迟,例如
viewPager.post {
viewPager.setCurrentItem(1,true)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。