Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewPager2适配器的状态不正确_Android_Kotlin_Android Fragments_Android Viewpager2 - Fatal编程技术网

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)
}