17

有一个ViewPager我从未见过的用例很好地实现。

ViewPager或多或少是静态结构。将 Pages 添加到右侧(附加到 Model 并显示它)并不难,但是,应该有一个很好用的解决方案来扩展 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)

类似于集合迭代器,但是是双向的。

其中 index/position 不限于从下到 0,而是可以使用整个范围的 Integer 类型。
也许不是基于数组的实现(从 0 到无限)。

我发现了这个“hack”:动态添加和删除视图到 viewpager
但正如我之前所说,我试图让它自然工作,而不是维护 3,5,... 项目并强制 ViewPager 更改基于当前位置在一些扭曲的逻辑上

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

4

2 回答 2

10

这有帮助吗,

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

于 2013-05-21T13:00:02.013 回答
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明确假设没有负位置值。

于 2013-05-21T10:08:07.253 回答