Android ViewPager2适配器的状态不正确
我在Android ViewPager2适配器的状态不正确,android,kotlin,android-fragments,android-viewpager2,Android,Kotlin,Android Fragments,Android Viewpager2,我在ViewPager2和FragmentStateAdapter 这是我的默认主屏幕: 当某些条件发生变化时,我正在为onViewCreated上的ViewPager2选择另一个适配器,因此它现在看起来应该是: 但不知何故,它只是显示了以前的片段,但是片段的数量发生了变化 我的适配器: 当需要4页时: 当需要3页时: 更改条件: override fun onViewCreated(view: View, savedInstanceState: Bundle?) { sup
ViewPager2
和FragmentStateAdapter
这是我的默认主屏幕:
当某些条件发生变化时,我正在为onViewCreated
上的ViewPager2
选择另一个适配器,因此它现在看起来应该是:
但不知何故,它只是显示了以前的片段,但是片段的数量发生了变化
我的适配器:
当需要4页时:
当需要3页时:
更改条件:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val currentOrgIsPendingOrHidden = mPresenter.getCurrentOrgState()
pager.adapter = if (currentOrgIsPendingOrHidden)
PendingUserPagerAdapter(this@HomeFragment)
else
OrgUserPagerAdapter(this@HomeFragment)
}
另外,在应用程序重新启动后,所有工作都按预期进行。我今天遇到了这个问题,并且能够解决我的问题。因为FragmentStateAdapter是一个RecyclerView适配器,所以如果适配器中的元素可以更改,您必须记住覆盖containsItem和getItemId。我和你一样实现了它,这在几乎所有情况下都有效。但是,如果ViewPager是从savedInstanceState包重新创建的,则无法正常工作
我认为这是因为ViewPager2试图重复使用旧片段,因为它们具有相同的itemId。您能告诉我们您在哪里设置ViewPager2吗?通常,如果要更改适配器,请再次使用
viewpager2.setAdapter(newAdapter)
。如果您正在执行我认为您正在执行的操作,并且只是在viewpager认为它是适配器的地方更改变量的内容,那么您就不会告诉viewpager2适配器的内容已更改(尽管getItemCount()
将在您更改页面时从类的新实例中使用,因此它认为原始页面集现在少了一项)@Andrew检查最后一个代码片段,这是我唯一设置新适配器的地方。您的代码片段中缺少一些东西,我还不太明白。因此,onViewCreated
通常作为片段创建过程的一部分调用,该过程承载活动中的viewpager2。这在托管片段创建时只调用一次,托管活动只创建一次该片段。因此,正如你所说,当你重新启动应用程序(片段和活动被重新创建)时,它会工作,但我不知道一旦第一次安装正确,它将如何被更改。我建议你展示更多的代码你明白了吗?我遇到了完全相同的行为。据我所见,当从savedInstanceState包重新创建ViewPager2时,问题就出现了。不幸的是,我还没有想出一个解决方案。你能为这个发布一个代码片段吗?
class PendingUserPagerAdapter(fragment: Fragment) :
FragmentStateAdapter(fragment) {
override fun getItemCount() = PendingUserPages.values().size
override fun createFragment(position: Int): Fragment {
return when (PendingUserPages.values()[position]) {
PendingUserPages.OPPORTUNITIES -> OpportunitiesFragment()
PendingUserPages.CHATS -> ChatsFragment()
PendingUserPages.PROFILE -> ProfileFragment()
}
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val currentOrgIsPendingOrHidden = mPresenter.getCurrentOrgState()
pager.adapter = if (currentOrgIsPendingOrHidden)
PendingUserPagerAdapter(this@HomeFragment)
else
OrgUserPagerAdapter(this@HomeFragment)
}