Как создать карусель ViewPager? - PullRequest
7 голосов
/ 13 февраля 2012

Все, что я хочу сделать, - это горизонтальная карусель в Android.

Если у меня 3 экрана AB и C, тогда я хочу, чтобы мой ViewPager позволял мне двигаться как A <-> B, B <->C, C <-> A.

GTalk для разговора Android можно переключать следующим образом.Главный экран Samsung и экран приложения можно переключать следующим образом.

AB и C являются фрагментами, и я использую адаптер, который расширяет FragmentPagerAdapter.Все фрагменты будут содержать веб-просмотр.

Я посмотрел здесь здесь и здесь, но, похоже, никто из них не делает то, что я хочу.

Кто-нибудь может направить меня в правильном направлении?

Ответы [ 3 ]

4 голосов
/ 19 октября 2012

(перекрестная публикация мой ответ из идентичного вопроса StackOverflow)

Одна из возможностей - настроить экраны следующим образом:

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, экран на мгновение мигает, по крайней мере, на моем текущем тестовом устройстве.

1 голос
/ 19 мая 2015

Настройки 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;
    }
}
0 голосов
/ 13 февраля 2012

Реализуйте 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 .. скачать исходный код и понять его.Надеюсь, это поможет.

...