【发布时间】:2021-09-20 08:33:14
【问题描述】:
我使用一个在该片段中包含一个片段的 Activity 我现在有一个包含 ViewPagger2 的片段,当应用程序打开时,它应该显示 ViewPagger2 的第一个孩子,并且也只加载该数据但它没有发生它加载两个孩子,这使我应用变慢如何解决这个问题。
【问题讨论】:
标签: android kotlin android-fragments android-viewpager2
我使用一个在该片段中包含一个片段的 Activity 我现在有一个包含 ViewPagger2 的片段,当应用程序打开时,它应该显示 ViewPagger2 的第一个孩子,并且也只加载该数据但它没有发生它加载两个孩子,这使我应用变慢如何解决这个问题。
【问题讨论】:
标签: android kotlin android-fragments android-viewpager2
viewPager2 的默认行为是加载相邻页面以获得更流畅的动画效果。但是您可以使用 viewpager2 setOffscreenPageLimit 方法覆盖默认的离屏页面限制。
在 kotlin 中使用
viewPager2.offscreenPageLimit = PAGE_COUNT
这将提前加载指定数量的页面。但是,这个PAGE_COUNT 不能小于1,这意味着它仍然会加载你的第二个片段。但是,它不应该像您提到的那样减慢您的应用程序。
如果您正在执行任何网络请求,则可以为 viewPager2 设置 registerOnPageChangeCallback 并覆盖 onPageSelected,然后仅在选择该片段时执行网络请求。
由于onPageSelected(position: Int)只给了我们选择页面的位置,而不是片段本身,所以我们必须使用childFragmentManager检索选择的片段,然后触发我们的网络加载请求。
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
if (childFragmentManager.fragments.size > position) {
if(position == 1) { // for second fragment
val fragment = childFragmentManager.fragments[position] as SecondFragmentClassName
fragment.loadNetworkData()
}
}
}
})
对于多个片段,您可以相应地使用when 语句。
【讨论】:
将数据加载放在 Fragment 的 onResume 方法中,因为 Viewpager2 仅在显示 Fragment 时恢复它。
这维护了 Fragment 的封装,但实现了与在 OnPageChangeCallback 中执行此操作相同的目标。
【讨论】: