如何创建轮播ViewPager?

时间:2012-02-13 11:24:20

标签: android android-viewpager

我想做的只是Android中的水平旋转木马。

如果我有3个屏幕A B和C,那么我希望我的ViewPager允许我移动 A - < - > B, B - < - > C, C - C - 。甲

GTalk for Android的对话可以像这样切换。 三星的主屏幕和应用程序屏幕可以像这样切换。

B和C是片段,我使用扩展FragmentPagerAdapter的适配器。所有片段都将包含webview。

我看过here here这里,但似乎没有人做我想做的事。

有人能引导我朝正确的方向前进吗?

3 个答案:

答案 0 :(得分:3)

(从相同的StackOverflow问题交叉发布my answer

一种可能性是设置这样的屏幕:

C'A B C A'

C'看起来就像C,但当你滚动到那里时,它会切换到真正的C. '看起来就像A,但当你滚动到那里时,它会切换到真正的A。

我会通过实施onPageScrollStateChanged来实现这一点:

@Override
public void onPageScrollStateChanged (int state) {
    if (state == ViewPager.SCROLL_STATE_IDLE) {
        int curr = viewPager.getCurrentItem();
        int lastReal = viewPager.getAdapter().getCount() - 2;
        if (curr == 0) {
            viewPager.setCurrentItem(lastReal, false);
        } else if (curr > lastReal) {
            viewPager.setCurrentItem(1, false);
        }
    }
}

请注意,这会调用setCurrentItem的替代形式并传递false以使跳转立即发生而不是平滑滚动。

我看到了两个主要缺点。首先,在到达任一端时,用户必须让滚动在他们可以走得更远之前解决。其次,它意味着在您的第一页和最后一页中拥有所有视图的第二个副本。根据屏幕资源的大小,这可能会排除这种技术作为一种可能的解决方案。

另请注意,由于视图寻呼机不会让点击进入底层控件直到滚动结束后,因此可能没有为A'和C'片段设置clicklisteners等。

编辑:现在我自己实现了这个,还有一个相当重要的缺点。当它从A'切换到A或C'到C时,屏幕会闪烁片刻,至少在我当前的测试设备上。

答案 1 :(得分:1)

ViewPager设置:

    mViewPager = (ViewPager) findViewById(R.id.view_pager);
    mViewPager.setAdapter(new YourPagerAdapter(getSupportFragmentManager()));
    //Set the number of pages that should be retained to either side of the current page.
    mViewPager.setOffscreenPageLimit(1);
    mViewPager.setCurrentItem(50);

FragmentPagerAdapter:

public class YourPagerAdapter extends FragmentPagerAdapter {
    final int PAGE_COUNT = 100;
    final int REAL_PAGE_COUNT = 3;

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

    @Override
    public Fragment getItem(int position) {
        while (position > REAL_PAGE_COUNT - 1) {
            position = position - REAL_PAGE_COUNT ;
        }

        switch (position) {
            case 0:
                return FirstFragment.newInstance(position);
            case 1:
                return SecondFragment.newInstance(position);
            case 2:
                return ThirdFragment.newInstance(position);
        }
        return null;
    }

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

答案 2 :(得分:0)

像这样实施getItem(int position)

public Fragment getItem(int position)
{
    switch(position)
    {
        case 0:
        Fragment A = new A();
        return A;
        case 1:
        Fragment B = new B();
        return B;
        same for C....
    }
}

您还可以在这里查看:SimpleViewPager ..下载源代码并了解它。希望它有所帮助。