双向无限/动态ViewPager

时间:2013-05-16 09:35:22

标签: java android dynamic collections

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)

与Collections Iterator类似,但是双向。

索引/位置不限于0以下,但可以使用整个范围的整数类型 也许不是基于数组的实现(从0到无限)。

我发现了这个" hack":dynamically add and remove view to viewpager
但正如我之前所说,我试图让它自然地工作,而不是维护3,5,...项目并迫使ViewPager根据一些扭曲的逻辑改变当前位置

目前是否有足够的实施或是否有必要实施? 如果这将是一个全新的实施,我愿意赏金奖励答案。

2 个答案:

答案 0 :(得分:7)

这会有所帮助,

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

答案 1 :(得分:2)

使用负位置值远远高于ViewPager使用的自然顺序非常,根本不是适配器问题。请查看Android SDK支持包源代码中的ViewPager源代码。例如,这是一个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 显式假设没有负面的位置值。