Найти в Дзене
Колыбель приложений

Реализация бесконечного ViewPager в Android-приложении

Часто в современных приложениях можно встретить экраны, которые поддерживают не только вертикальный скролл, как вездесущие ленты с контентом, но и скролл горизонтальный. В зависимости от типа горизонтального скролла, который необходимо реализовать, в Android-приложениях можно использовать разные типы виджетов, например: Последний вариант используется чаще всего на экранах, где есть строго определенное количество вкладок, либо это количество определяется сервером. Как правило, в этих случаях сложностей с реализацией не возникает, потому что вы просто говорите адаптеру вашего ViewPager сколько элементов он должен содержать и задаёте логику определения внешнего вида каждого конкретного элемента. Но что если вам заранее неизвестно количество элементов для ViewPager? Или ещё лучше: что если количество элементов должно быть бесконечным? Пример такого случая можно подсмотреть в нашем приложении "Бюджет 2.0". Экран истории операций представляет собой реализацию "бесконечного" горизонтального с

Часто в современных приложениях можно встретить экраны, которые поддерживают не только вертикальный скролл, как вездесущие ленты с контентом, но и скролл горизонтальный. В зависимости от типа горизонтального скролла, который необходимо реализовать, в Android-приложениях можно использовать разные типы виджетов, например:

  • для непрерывного скролла: RecyclerView или HorizontalScrollView
  • для дискретного скролла (т.е. когда после скролла на экране должен остаться выбранным только один элемент): ViewPager

Последний вариант используется чаще всего на экранах, где есть строго определенное количество вкладок, либо это количество определяется сервером. Как правило, в этих случаях сложностей с реализацией не возникает, потому что вы просто говорите адаптеру вашего ViewPager сколько элементов он должен содержать и задаёте логику определения внешнего вида каждого конкретного элемента.

Но что если вам заранее неизвестно количество элементов для ViewPager? Или ещё лучше: что если количество элементов должно быть бесконечным? Пример такого случая можно подсмотреть в нашем приложении "Бюджет 2.0". Экран истории операций представляет собой реализацию "бесконечного" горизонтального скролла. В кавычках, потому что на самом деле он, конечно же, конечный - оперативная память не резиновая:

Пользователь может скроллить экран влево и вправо, осуществляя навигацию по дням недели для просмотра истории операций в нужный день. И скроллить он может сколько угодно, ведь даты слева и справа от сегодняшней в принципе ничем не ограничены. А секрет бесконечного скролла в том, что количество элементов в адаптере ViewPager определено как Int.MAX_VALUE, т.е. 2 147 483 647 штук. При инициализации экрана позиция текущего элемента определяется как Int.MAX_VALUE/2, а остальные позиции просчитываются добавлением смещения к этой центральной позиции.

Конечно, ViewPager не отрисовывает сразу максимальное количество элементов за границами экрана, поэтому приложение не падает из-за нехватки памяти от такого количеств страниц. Количество элементов, которые создаёт и отрисовывает Android-фреймворк определяется параметром offscreenPageLimit в вашем ViewPager, и вам вполне достаточно держать по одному-два экрана по бокам от основного для обеспечения плавной навигации.

Берите на вооружение и пользуйтесь, но помните, что всегда может найтись тестировщик, которые проскроллит миллиард-другой страниц в обе стороны, увидит, что бесконечность не настоящая, и заведёт вам баг. Так что лучше сразу придумайте себе отмазку на этот случай.