【问题标题】:How to create carousel ViewPager?如何创建轮播 ViewPager?
【发布时间】:2015-05-19 18:48:22
【问题描述】:

我只想在 Android 中做一个水平轮播。

如果我有 3 个屏幕 A B 和 C,那么我希望我的 ViewPager 允许我像这样移动 A B, B C, C A.

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

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

我看过here here 和这里,但他们似乎都没有做我想做的事。

谁能指引我正确的方向?

【问题讨论】:

标签: android android-viewpager


【解决方案1】:

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

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

C' A B C A'

C' 看起来就像 C,但是当您滚动到那里时,它会将您切换到真正的 C。 A' 看起来就像 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' 片段设置点击侦听器等。

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

【讨论】:

  • 我已经尝试过了。还有其他额外的问题。如果 A 中的某些视图发生了变化,那么 A` 也应该反映相同。就像您在 A 中滚动,然后如果您转到 A`,它会向您显示未滚动的屏幕一秒钟并再次导致闪烁。
【解决方案2】:

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;
    }
}

【讨论】:

    【解决方案3】:

    像这样实现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.. 下载源代码并理解它。希望对您有所帮助。

    【讨论】:

    • 我知道如何创建 ViewPager。我想知道如何让它循环。像屏幕 a 到 b b 到 c c 到 a 再回来。
    • 对不起,我以为你问的是 viewpager。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2011-10-08
    • 1970-01-01
    • 2023-04-01
    • 2023-02-22
    相关资源
    最近更新 更多