FragmentPagerAdapter奇怪的行为

时间:2018-06-07 10:15:09

标签: android android-layout android-fragments fragmentpageradapter android-pageradapter

所以我有FragmentPagerAdapter的下一个问题。我有一个带有3个标签的TabLayout,代表我可以切换的3个片段。因此当我切换到第三个片段时,由于某种原因,第一个片段消失(或其视图)。有谁知道如何解决这个问题?提前致谢。

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private static final int FRAGMENT_COUNT = 3;

private final List<Fragment> listOfFragments = new ArrayList<>();

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position);
}

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

public void addFragment(Fragment fragment) {
    listOfFragments.add(fragment);
}


}

这是FragmentPagerAdapter的代码。

4 个答案:

答案 0 :(得分:0)

我不知道你的问题是什么。但是如果在您的应用中只有3个片段,那么您可以尝试setOffscreenPageLimit <{1}}

的方法
ViewPager

答案 1 :(得分:0)

我真的不知道会发生什么,但这是我的代码,希望这有助于你

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List<Fragment> fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

这是我的Tablayout:

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);

答案 2 :(得分:0)

这里的一个问题是一个有点混乱的API。

FragmentPagerAdapter中,getItem(int position)实际上意味着“创建项目”。换句话说,您不应尝试在适配器的列表中手动缓存片段。

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

尽管它可能看起来反直觉,但您实际上应该在getItem内创建一个新的Fragment实例,并且非常贴近Google的官方示例:

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

否则,您将遇到FragmentManager的缓存和您自己的List<Fragment>缓存不同步的问题。简而言之,片段的缓存由FragmentManager处理,您不需要自己进行缓存。

答案 3 :(得分:0)

而且我认为我修复了这个:)我唯一能做的就是覆盖FragmentPagerAdapter destroyItem()方法,空体(没有超级)。

相关问题