Unlimited/Dynamic ViewPager in both directions

前端 未结 2 1630
死守一世寂寞
死守一世寂寞 2021-02-02 13:59

There is one use-case of ViewPager I\'ve never seen pretty implemented.

ViewPager is more or less static structure. It\'s not so hard to add Pa

相关标签:
2条回答
  • 2021-02-02 15:00

    Using negative position values stands very far from natural order of ViewPager usage and is not the Adapter issue at all. Please have a look into the source code of ViewPager in the support package source in Android SDK. For example, here is a setCurrentItemInternal private implementation:

    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);
    }
    

    As you can see, ViewPager explicitly assumes no negative position values.

    0 讨论(0)
  • 2021-02-02 15:02

    Will this help,

    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();
            }
        }
    }
    

    and then,

    mPager.setCurrentItem((int)(Integer.MAX_VALUE/2)); // assuming mPager is your ViewPager

    0 讨论(0)
提交回复
热议问题