Android ViewPager中的位置值错误

时间:2014-12-23 03:36:29

标签: android slider android-viewpager fragment

我正在尝试使用ViewPager实现由3个片段(或3个布局)组成的3张幻灯片,我想知道我当前显示哪张幻灯片以显示相应的内容。简单来说,我想要幻灯片1上的内容1,幻灯片2上的内容2,依此类推。

这是我的Activity中的实际代码(来自android官方文档):

public class SliderActivity extends FragmentActivity {
    private static final int NUM_PAGES = 3;
    private ViewPager mPager;
    private PagerAdapter mPagerAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slider);

        // Instantiate a ViewPager and a PagerAdapter.
        mPager = (ViewPager) findViewById(R.id.pager);
        mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        mPager.setAdapter(mPagerAdapter);
    }

    @Override
    public void onBackPressed() {
        if (mPager.getCurrentItem() == 0) {
            // If the user is currently looking at the first step, allow the system to handle the
            // Back button. This calls finish() on this activity and pops the back stack.
            super.onBackPressed();
        } else {
            // Otherwise, select the previous step.
            mPager.setCurrentItem(mPager.getCurrentItem() - 1);
        }
    }

    // A simple pager adapter that represents 3 ScreenSlidePageFragment objects, in sequence.
    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
        public ScreenSlidePagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            System.out.println("POSITION = " + position); // Or mPager.getCurrentItem()
            return new SlidesFragment();
        }

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

无论我怎么努力,getCurrentItem()position仍会打印错误的值。只有第二张幻灯片才会向控制台发送一个号码。我向右滑动时为2,向左滑动时为0。

我做错了什么?

1 个答案:

答案 0 :(得分:6)

您肯定想要使用getItem中的位置值,不要调用getCurrentItem,因为寻呼机会创建不是当前项目而不是屏幕上的项目。默认情况下,寻呼机的屏幕外页面限制为2。因此,当它首次创建时,getItem将被调用,其位置为0,然后立即再次调用位置1.位置1处的片段不是当前项目,但它是在屏幕外创建的,因此用户可以开始滑过并看到它。然后,当您完成滑动时,会调用位置为2的getItem来预加载下一张和最后一张幻灯片。

要完成“我想要幻灯片1上的内容1,幻灯片2上的内容2”,您的SlidesFragment需要获取一个参数(存储在参数包中),该位置告诉它要显示哪些内容。或者,更有可能的是,您将根据位置创建3种不同的片段类型。