(перекрестная публикация мой ответ из идентичного вопроса 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, экран на мгновение мигает, по крайней мере, на моем текущем тестовом устройстве.