【问题标题】:getItem called twice and this causes tab1 and tab2 both executed in FragmentPagerAdaptergetItem 调用了两次,这导致 tab1 和 tab2 都在 FragmentPagerAdapter 中执行
【发布时间】:2015-05-20 07:05:14
【问题描述】:

我有一个滑动标签,其中包含三个标签的三个不同片段。 FragmentPagerAdapter 中的 getItem 方法调用了两次。我的第一个选项卡加载本地数据,并且布局与接下来的两个选项卡(tab2、tab3)不同。 Tab2 和 Tab3 从服务器获取数据并相应加载。

我的问题是,第一次加载 getItem 调用了两次,这导致 tab1 和 tab2 都执行了。虽然 tab1 只包含本地数据,但由于两次调用 tab2 执行并从服务器获取数据。

我不想在 tab1 中执行 tab2 和它的功能等等。

getItem() 代码:

@Override public Fragment getItem(int position) { 
    Fragment fragment = null; 
    switch (position) { 
        case 0: fragment = new CommentFragment(); break; 
        case 1: fragment = new AllPostFragment(); break; 
        case 2: fragment = new TodayFragment(); break; 
    } 
    return fragment; 
}

所以,我正在寻找解决方案。如果可以的话,请帮助我。

【问题讨论】:

  • 可以分享代码吗
  • @Override public Fragment getItem(int position) { Fragment fragment = null; switch (mViewPager.getCurrentItem()) { case 0: fragment = new CommentFragment();休息;案例1:片段=新的AllPostFragment();休息;案例 2:fragment = new TodayFragment();休息; } 返回片段;这是我的 getItem 方法。 CommentFragment 没有服务器交互。但是 allPostFragement 从服务器获取数据。所以第一次,大小写匹配位置 0 和 1 并执行 AllPostFragment 并开始从服务器获取数据。
  • 添加了来自 OP 评论的代码

标签: android android-fragments fragmentpageradapter


【解决方案1】:

在 ViewPager 中,您的 ViewPager 将加载多少个屏幕(片段)是有限制的。您可以通过调用 ViewPagers setOffscreenPageLimit 方法来设置。

但是,如果您检查 ViewPagers code,它会告诉您必须至少加载 1 个屏幕外页面:

private static final int DEFAULT_OFFSCREEN_PAGES = 1;

public void setOffscreenPageLimit(int limit) {
    if (limit < DEFAULT_OFFSCREEN_PAGES) {
        Log.w(TAG, "Requested offscreen page limit " + limit 
            + " too small; defaulting to " + DEFAULT_OFFSCREEN_PAGES);
        limit = DEFAULT_OFFSCREEN_PAGES;
    }
    // ...
}

底线:我认为你不能只加载当前的 Fragment,抱歉。

编辑:但是,如果您想加载,比如说,仅当片段对用户可见时来自网络的数据,您可以在片段中执行类似的操作:

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if (isVisibleToUser) {
        // Fetch data or something...
    }
}

【讨论】:

  • 你的建议听起来不错。这种方法可能会奏效。我会尽力让你知道。谢谢大佬!
  • 这正是我想要的。奇妙的解决方案。我不知道这种方法。我花了将近3-4天。尝试了许多不同的方法来解决这个问题。 setUserVisibleHint 方法简单地解决了我的问题。太棒了!谢谢十亿。
【解决方案2】:

当标签中有两个片段时,通常两个片段都会启动并“并行”运行。这是正常行为。您可以使用某种EventBus 或类似的方式来手动控制片段的生命周期。

【讨论】:

  • 感谢您的回复。是的,两个片段同时运行。其实这是我的问题。我不想在第一次加载时从 Tab2 中的服务器获取数据。我已经看到 getItem 调用了两次,并且我根据位置在片段之间使用了 SWITCH_CASE。第一次 CASE 匹配位置 0 和位置 1。虽然 Tab1 可见,但有一种方法可以从服务器获取数据,在 Tab2 中被调用。我会看看你提到的。谢谢。
  • 您可以触发一个事件,例如:而不是在 onCreate / 中调用服务器,而是调用正在等待选择第二个选项卡的回调。
  • ' @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (isVisibleToUser) { // Fetch data or something... } }' 这个方法解决了我的问题。 vilpe89 回答完美。
【解决方案3】:

是的。在每个片段中调用此方法并在其上调用您的方法等:

  override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if(isVisibleToUser)
            loadData() 
    }
  • 不要写在第一个片段中!

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多