FragmentPagerAdapter 以一种奇怪的方式工作

FragmentPageAdapter works in a strange way

因为在 Android L 中不推荐使用操作栏导航模式,所以我正在寻找其他方式来使用选项卡,我发现可以使用 PagerTabStrip (android.support.v4.view.PagerTabStrip),所以我以这种方式创建了一个 FragmentPageAdapter:

public class TitleAdapter extends FragmentPagerAdapter {

    private final String titles[] = new String[] { "Home", "Events", "People", "Books"};
    private final Fragment frags[] = new Fragment[titles.length];
    Context context;
    public TitleAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Log.v("TitleAdapter - getPageTitle=", titles[position]);
        return titles[position];
    }

    @Override
    public Fragment getItem(int position) {
        Log.v("TitleAdapter - getItem=", String.valueOf(position));
        //return frags[position];
        switch (position) {
        case 0:
            return Home.newInstance(0, "Home");
        case 1:
            return Events.newInstance(1, "Events");
        case 2:
            return People.newInstance(2, "People");
        case 4:
            return Books.newInstance(3, "Books"); 
        }
        return null;
    }

    @Override
    public int getCount() {
        return frags.length;
    }
}

我在 LogCat 中看到的奇怪方式是当 mainActivity 开始时方法 getItem() 被调用了 4 次所以我不得不等待很多,因为在每个选项卡中都有一个很长的列表,这个列表是通过调用 Web 服务的 HTTP 请求填充的。

我希望每次只加载一个片段而不是全部。当我使用 actionbar.Tablistener 时,这是可能的,但现在该方法已被弃用,那么有没有办法做到这一点?

我是这样在onCreate方法中设置adapter和viewPager的:

@Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.prova_page_tab_stripes);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);

        titleAdapter = new TitleAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(titleAdapter);
        mViewPager.setOffscreenPageLimit(1);
    }

初始化的页数取决于ViewPagersetOffscreenPageLimit函数。根据 http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

中的 android 文档

public void setOffscreenPageLimit (int limit)

Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state. Pages beyond this limit will be recreated from the adapter when needed. This is offered as an optimization. If you know in advance the number of pages you will need to support or have lazy-loading mechanisms in place on your pages, tweaking this setting can have benefits in perceived smoothness of paging animations and interaction. If you have a small number of pages (3-4) that you can keep active all at once, less time will be spent in layout for newly created view subtrees as the user pages back and forth. You should keep this limit low, especially if your pages have complex layouts. This setting defaults to 1. Parameters limit How many pages will be kept offscreen in an idle state.

如果您想限制要保留的页面,请将其设置为 1 或保持默认值。

但是如果您只想一次加载一页中的数据,您可以确定片段何时可​​见,然后加载数据(而不是在 onCreateView 中加载。) 参考这个问题:How to determine when Fragment becomes visible in ViewPager