Android getItem调用了两次,这导致tab1和tab2都在FragmentPagerAdapter中执行

Android getItem调用了两次,这导致tab1和tab2都在FragmentPagerAdapter中执行,android,android-fragments,fragmentpageradapter,Android,Android Fragments,Fragmentpageradapter,我有一个滑动标签,三个标签有三个不同的片段。FragmentPagerAdapter中的getItem方法调用了两次。我的第一个选项卡加载本地数据,并且与下两个选项卡(选项卡2、选项卡3)的布局不同。Tab2和Tab3从服务器获取数据并相应地加载 我的问题是,第一次加载两次调用的getItem,这导致tab1和tab2都被执行。虽然tab1只包含本地数据,但由于执行了两次调用tab2并从服务器获取数据 我不想在tab1中执行tab2及其功能,以此类推 getItem()代码: @Override

我有一个滑动标签,三个标签有三个不同的片段。FragmentPagerAdapter中的getItem方法调用了两次。我的第一个选项卡加载本地数据,并且与下两个选项卡(选项卡2、选项卡3)的布局不同。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; 
}

所以,我在寻找解决办法。如果可以的话,请帮助我

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

但是,如果检查,它会告诉您必须至少加载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;
    }
    // ...
}

当一个选项卡中有两个片段时,通常两个片段都将启动并“并行”运行。这是正常的行为。您可以使用某种或类似的方法手动控制片段的生命周期。

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

  override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if(isVisibleToUser)
            loadData() 
    }
  • 不要把它写在第一个片段里
您能分享一下吗code@Override公共片段getItem(int位置){Fragment Fragment=null;开关(mViewPager.getCurrentItem()){case 0:Fragment=new CommentFragment();break;case 1:Fragment=new allpostframent();break;case 2:Fragment=new TodayFragment();break;}return fragment;}这是我的getItem方法。CommentFragment没有服务器交互。但allPostFragement从服务器获取数据。因此,这是第一次,位置0和1的大小写都匹配,执行AllPostFragment并开始从服务器获取数据。从OPs Comments添加了代码感谢您的回复。是的,两个片段同时运行。实际上这是我的问题。我不想在第一次加载时从Tab2中的服务器获取数据。我已经见过两次调用getItem,并且在基于位置的片段之间使用了SWITCH_CASE。第一次为位置0和位置1匹配案例。虽然Tab1可见,但在Tab2中调用了从服务器获取数据的方法。我会看看你提到的。谢谢。您可以触发一个事件,例如:在onCreate/whatever中不调用服务器,而是调用正在等待选择第二个选项卡的回调。“@Override public void setUserVisibleHint(布尔值isVisibleToUser){super.setUserVisibleHint(isVisibleToUser);if(isVisibleToUser){//获取数据或其他…}"这个办法解决了我的问题。vilpe89的答案非常有效。你的建议听起来不错。这种方法可能有效。我会尽力让你知道的。谢谢你,伙计!这正是我想要的。很好的解决方案。我不知道这个方法。我花了将近3-4天的时间。尝试了许多不同的方法来解决这个问题。setUserVisibleHint方法简单地解决了我的问题。太棒了!非常感谢。
  override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        if(isVisibleToUser)
            loadData() 
    }