FragmentPagerAdapter的getItem()中的switch语句如何工作?

时间:2014-09-16 10:47:39

标签: android android-viewpager

看一下这段代码:

@Override
    public Fragment getItem(int index){

       Log.i("Tab position", String.valueOf(index));
        switch (index) {
        case 0:
            // Top Rated fragment activity
            return new TopRatedFragment();
        case 1:
            // Games fragment activity
            return new GamesFragment();
        case 2:
            // Movies fragment activity
            return new MoviesFragment();
        }

        return null;
    }    

       @Override
        public int getCount() {
            // TODO Auto-generated method stub

            return 3;
        }

ViewPager工作正常,但如何?

  1. 当我启动我的应用程序时,我会使用TabPosition 0和1来跟踪Logcat:

    09-16 15:28:20.353: I/Tab position(2737): 0 09-16 15:28:20.372: I/Tab position(2737): 1

  2. 现在,当我选择第二个标签或滑动到第二个页面时,我会使用TabPosition 2跟踪Logcat:

    09-16 15:28:29.072: I/Tab position(2737): 2

  3. 当我选择第三个标签或滑动到第三页时,没有Logcat和TabPosition没有打印:

  4. 我的困惑是我知道getItem()返回的索引不是当前所选页面或制表符的位置,但它是需要呈现的页面位置。

    但是如果是这种情况那么switch语句如何返回正确的片段虽然索引不正确。

    例如:

    最初由getItem() 0和1返回两个索引,现在switch语句决定如何选择0或1.

    我希望你理解问题。

1 个答案:

答案 0 :(得分:1)

它的工作原理如下:

当您设置适配器时,ViewPager将要求适配器显示第一个片段(索引0)和右侧(索引1)。

这是因为ViewPager总是缓存除了当前显示的页面之外的一些页面。 " some"的默认值是1但你可以用

更改它

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int)

注意0没有左邻居(索引-1),所以在开头只加载索引0和1。

现在,当您将页面索引为1时,ViewPager已在其缓存中具有相应的片段,并且可以立即显示它。但它也会向适配器询问索引2,因为它将是下一个。

同样,当您翻页到索引2时,它已经有了片段并且可以显示它。由于2没有正确的邻居(ViewPager从你的getCount中知道),没有什么可以加载......

编辑:所以,更直接地回答你的原始问题:switch语句永远不必在0和1之间做出决定。对于0调用一次getItem,对于1调用一次,它在每种情况下返回相应的片段,然后返回ViewPager决定显示哪些。