Неограниченный/Динамический ViewPager в обоих направлениях

Существует один прецедент ViewPager, который я никогда не видел.

ViewPager - более или менее статическая структура. Не так сложно добавлять страницы в нужную сторону (добавление к модели и ее отображение), однако должно быть приятное в использовании решение для расширения PagerAdapter (или некоторых из его подклассов), чтобы оно могло расширяться в обоих направлениях.

Я могу представить себе интерфейс для адаптера

boolean isEmpty()
boolean hasNext()
boolean hasPrevious()
Object  getNext()
Object  getPrevious()
Object  getItem(int position)

// or if using generics
T       getNext()
T       getPrevious()
T       getItem(int position)

Подобно сборнику Iterator, но в обоих направлениях.

Если индекс/позиция не ограничена снизу на 0, но может использовать весь диапазон типа Integer.
Возможно, не основывается реализация на массиве (от 0 до бесконечного).

Я нашел этот "хак": динамически добавлять и удалять вид на просмотрщик
Но, как я уже говорил, я пытаюсь заставить его работать нормально, не поддерживая 3,5,... элементы и заставляя ViewPager менять текущую позицию на основе некоторой витой логики

Есть ли в настоящее время достаточная реализация или необходимо ее реализовать?
Я готов вознаградить вознаграждение, если это будет совершенно новая реализация.

Ответы

Ответ 1

Будет ли это помогать,

public static class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return Integer.MAX_VALUE;
    }

    @Override
    public Fragment getItem(int position) {
        return getFragmentBasedOnPosition(position);
    }

    private Fragment getFragmentBasedOnPosition(int position) {
        int fragmentPos = position % 3; // Assuming you have 3 fragments
        switch(fragmentPos) {
            case 1:
            return Fragment1.newInstance();
            case 2:
            return Fragment2.newInstance();
            case 3:
            return Fragment3.newInstance();
        }
    }
}

а затем

mPager.setCurrentItem((int)(Integer.MAX_VALUE/2));//Предполагая, что mPager - это ваш ViewPager

Ответ 2

Использование отрицательных значений позиции стоит очень вдали от естественного порядка использования ViewPager и вовсе не является проблемой адаптера. Пожалуйста, ознакомьтесь с исходным кодом ViewPager в источнике пакета поддержки в Android SDK. Например, вот частная реализация setCurrentItemInternal:

void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int velocity) {
    if (mAdapter == null || mAdapter.getCount() <= 0) {
        setScrollingCacheEnabled(false);
        return;
    }
    if (!always && mCurItem == item && mItems.size() != 0) {
        setScrollingCacheEnabled(false);
        return;
    }

    if (item < 0) {
        item = 0;
    } else if (item >= mAdapter.getCount()) {
        item = mAdapter.getCount() - 1;
    }
    final int pageLimit = mOffscreenPageLimit;
    if (item > (mCurItem + pageLimit) || item < (mCurItem - pageLimit)) {
        // We are doing a jump by more than one page.  To avoid
        // glitches, we want to keep all current pages in the view
        // until the scroll ends.
        for (int i=0; i<mItems.size(); i++) {
            mItems.get(i).scrolling = true;
        }
    }
    final boolean dispatchSelected = mCurItem != item;
    populate(item);
    scrollToItem(item, smoothScroll, velocity, dispatchSelected);
}

Как вы можете видеть, ViewPager явно не принимает отрицательных значений позиции.