gpt4 book ai didi

Android:ViewPager2 在创建时设置起始页不起作用

转载 作者:行者123 更新时间:2023-12-04 03:56:40 25 4
gpt4 key购买 nike

我有一个包含两个 fragment 的 viewpager 和一个 viewModel(存储在父 Activity 中)保存当前页面可见索引的记录。

这是父 fragment 的设置:

 override fun setUp() {
super.setUp()
titles = arrayOf(R.string.providers, R.string.create_provider)
fragments = arrayOf(ProvidersListFragment(), CreateProviderFragment())
pagerAdapter = BaseFragmentAdapter(this, fragments = fragments)
}

override fun setUpViews() {
super.setUpViews()
binding.page.adapter = pagerAdapter
TabLayoutMediator(binding.tabs, binding.page) { tab, position ->
tab.text = getString(titles[position])
}.attach()
binding.page.currentItem = viewModel.currentPage.value!!
}

override fun setUpObservers() {
super.setUpObservers()
viewModel.currentPage.observe(viewLifecycleOwner, {
Log.d(TAG, "setUpObservers: it = $it")
if (it != binding.page.currentItem)
binding.page.currentItem = it
})
}

以上3个方法在onResume()内部被调用.

ViewModel 像这样保存当前索引的记录: var currentPage = MutableLiveData<Int>().apply { value = 1 }

从技术上讲,起始页应该是索引 1,在我的情况下,TabMediator 显示好像选择了第 1 页,但布局显示第 0 页的内容(甚至没有完全加载)。

这就是它所显示的:

the error layout

这就是它应该显示的内容:

enter image description here

这是布局0:

enter image description here

关于这种行为的任何想法以及我如何避免它?

最佳答案

我遇到了同样的问题并注意到它与过早设置页面有关(在创建任何 fragment 之前)。所以我需要等待适配器完成创建 fragment 。不幸的是,当适配器完成加载或创建 fragment 时似乎没有回调方法,所以我创建了这个子类

inner class TabAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) {

private var finished = false

// other stuff

override fun onBindViewHolder(holder: FragmentViewHolder, position: Int, payloads: MutableList<Any>) {
super.onBindViewHolder(holder, position, payloads)
if (!finished) {
finished = true
// TODO set starting page
}
}
}

这不是一个真正干净的解决方案,但它为我完成了工作。

关于Android:ViewPager2 在创建时设置起始页不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63754832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com