【问题标题】:View Pagger loads two child data at same timeView Pagger 同时加载两个子数据
【发布时间】:2021-09-20 08:33:14
【问题描述】:

我使用一个在该片段中包含一个片段的 Activity 我现在有一个包含 ViewPagger2 的片段,当应用程序打开时,它应该显示 ViewPagger2 的第一个孩子,并且也只加载该数据但它没有发生它加载两个孩子,这使我应用变慢如何解决这个问题。

【问题讨论】:

    标签: android kotlin android-fragments android-viewpager2


    【解决方案1】:

    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 语句。

    【讨论】:

    • 这意味着我在这个 viewpagger.registerOnPageChangeCallback 部分中添加了我所有的网络调用
    • 不,不要那样做。将您的网络调用保存在各自的片段中。只需在选择该片段时触发它们。
    • 我是如何触发它们的
    • 我已经更新了答案
    【解决方案2】:

    将数据加载放在 Fragment 的 onResume 方法中,因为 Viewpager2 仅在显示 Fragment 时恢复它。

    这维护了 Fragment 的封装,但实现了与在 OnPageChangeCallback 中执行此操作相同的目标。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 2014-09-04
      • 1970-01-01
      • 2016-01-04
      相关资源
      最近更新 更多