ViewPager与3个片段,从中间片段加载两侧的片段。

3

我有三个片段A、B和C。它们被设置为选项卡Tab A、Tab B、Tab C,并使用适配器显示,如下面的代码所示。我已经设置了我的页面适配器,使得中间的选项卡Tab B加载了第一个

adapter = new PagerAdapter(getSupportFragmentManager(),tabLayout.getTabCount());
if (viewPager != null) {
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(1);
}

所有这些工作都很好,但是当我第一次从选项卡B导航到选项卡C时,它完美地运行。然而,当我第一次从选项卡B导航到选项卡A时,它显示的是片段B而不是A。当我第二次导航时(从选项卡B到选项卡A),它现在按预期工作。如何解决这种初始延迟和选项卡不匹配的问题。

public class PagerAdapter extends FragmentStatePagerAdapter {

    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                FragmentA A = new FragmentA();
                return A;


            case 1:
                FragmentB B = new FragmentB();
                return B;

           case 2:
                FragmentC C = new FragmentC();
                return C;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

你想在每次滑动页面时返回一个新的Fragment吗?我认为更合理的做法是保留页面之间的Fragment实例,这样就不会丢失任何数据。 - OneCricketeer
碎片的内容在滑动时会发生变化,因此我需要新的实例...无法承担缓存它们的成本。 - James Wahome
如果您的适配器有3个选项卡,请将3传递给它。为什么要使用tabLayout.getTabCount()?您的选项卡数量是动态的吗? - savepopulation
没有任何一个制表符数量是静态的3。 - James Wahome
1个回答

1

为了避免重复打印,可以调用setRetainInstance(true)

如果您需要找到一个片段的标签,则可以通过FragmentTransaction类使用自己的标签创建它。

在ViewPager的情况下,FragmentPagerAdapter分配其标签的片段可以在其源代码中看到。

有一种方法可以将片段名称(int viewId,long id)分配给片段标记类型:

private static String makeFragmentName(int viewId, long id) {
        return "android:switcher:" + viewId + ":" + id;
    }

其中 viewId 是 ViewPager 的 id,id 是片段的位置。

或者使用 setOffscreenPageLimit

mViewPager.setOffscreenPageLimit(mViewPager.getCount());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接