双向无限/动态取景台

2022-09-03 02:35:24

有一个用例我从未见过完全实现。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)

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

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

我发现了这个“黑客”:动态添加和删除视图到viewpager
但是正如我之前所说,我试图让它自然地工作,而不是维护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使用的自然顺序去甚远,根本不是适配器问题。请查看 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 显式假定没有负仓位值。


推荐