android 不要在ViewPager中一次启动每个片段

inkz8wg9  于 2023-05-21  发布在  Android
关注(0)|答案(3)|浏览(124)

我在应用中实现了一个View Pager。它在片段之间滑动,问题是,即使只显示第一个片段,也会创建另一个片段。这会导致问题,因为在第二个片段中,我显示了一个Loading Bar,这样它就显示在第一个片段中而不是第二个片段中。
这是我的ViewPager代码:

class FragmentViewPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {

    override fun getItem(position: Int): Fragment {
        if (position == 0){
            return VentFragment()
        }
        return ConversationsFragment()
    }

    override fun getCount(): Int {
        return 2
    }

}

在第二个片段中,我在onCreateView中这样调用加载栏:

loading = ProgressDialog(context)

        loading.setTitle(getString(R.string.loading))
        loading.setMessage(getString(R.string.fetching_your_data))
        loading.setCanceledOnTouchOutside(false)
        loading.show()

是因为上下文吗?我好像找不到窃听器...

7kqas0il

7kqas0il1#

问题是,即使只显示第一个片段,也会创建其他片段
这就是ViewPager的工作方式。它需要第二个片段可用,以便在用户滑动时过渡到它,而不是等待您在用户开始滑动后创建它。
在第二个片段中,我显示了一个加载栏,这样它就显示在第一个片段中,而不是第二个片段中
你的第二个片段有个漏洞。一个片段--尤其是一个ViewPager--不应该修改位于片段本身之外的UI。如果您修复了这个bug,那么ViewPager的问题应该会消失。

b91juud3

b91juud32#

因此,可以使用ViewPager对UI数据进行“延迟加载”(我就是这样做的),这样数据和加载栏只在页面被选中时显示。

更新:

我建议您迁移到ViewPager2,因为ViewPager2与ViewPager不同,它正确地支持Fragment生命周期。
这意味着您可以轻松地在Fragment的onResume方法中更新占位符(或启动加载栏
我刚刚使用ViewPager方法使用ViewPager2完成了一个完整的示例,请参见https://stackoverflow.com/a/60253406/2373819(Update2有完整的示例,并且类似于如果您仍然想使用ViewPager,您可以这样做)
请注意,这两种方法都会导致屏幕更新显示正确的(最新的)数据,这可以在转换期间进行,也可以在转换完成后立即使用ViewPager2和onResume进行,但之后您可能会得到不正确的旧数据,也可以进行第二次屏幕更新以获得正确的最新数据。

oyt4ldly

oyt4ldly3#

您可以在onResume()中进行网络调用,而不是在onCreate中对片段进行网络调用。所以当片段被恢复时,只会进行调用,并显示加载器。

相关问题