我在应用中实现了一个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()
是因为上下文吗?我好像找不到窃听器...
3条答案
按热度按时间7kqas0il1#
问题是,即使只显示第一个片段,也会创建其他片段
这就是
ViewPager
的工作方式。它需要第二个片段可用,以便在用户滑动时过渡到它,而不是等待您在用户开始滑动后创建它。在第二个片段中,我显示了一个加载栏,这样它就显示在第一个片段中,而不是第二个片段中
你的第二个片段有个漏洞。一个片段--尤其是一个
ViewPager
--不应该修改位于片段本身之外的UI。如果您修复了这个bug,那么ViewPager
的问题应该会消失。b91juud32#
因此,可以使用ViewPager对UI数据进行“延迟加载”(我就是这样做的),这样数据和加载栏只在页面被选中时显示。
更新:
我建议您迁移到ViewPager2,因为ViewPager2与ViewPager不同,它正确地支持Fragment生命周期。
这意味着您可以轻松地在Fragment的
onResume
方法中更新占位符(或启动加载栏我刚刚使用ViewPager方法使用ViewPager2完成了一个完整的示例,请参见https://stackoverflow.com/a/60253406/2373819(Update2有完整的示例,并且类似于如果您仍然想使用ViewPager,您可以这样做)
请注意,这两种方法都会导致屏幕更新显示正确的(最新的)数据,这可以在转换期间进行,也可以在转换完成后立即使用ViewPager2和
onResume
进行,但之后您可能会得到不正确的旧数据,也可以进行第二次屏幕更新以获得正确的最新数据。oyt4ldly3#
您可以在onResume()中进行网络调用,而不是在onCreate中对片段进行网络调用。所以当片段被恢复时,只会进行调用,并显示加载器。