Search code examples
javaandroid-studiosliderinfinite-scrollandroid-viewpager2

How to make a circular view pager2?


How can I make a circular view pager2(infinite-scrolling) in java? for example I wanna go from page 1to page 100 while swiping left and not to get stopped.

myViewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            super.onPageScrolled(position, positionOffset, positionOffsetPixels);
            Log.d(CPAct,"onPageScrolled "+position);
        }

        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            Log.d(CPAct,"onPageSelected Position: "+position);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            super.onPageScrollStateChanged(state);
            Log.d(CPAct,"onPageScrollStateChanged  state: "+state);
          
            if (state == ViewPager2.SCROLL_STATE_IDLE) {
                if (myViewPager2.getCurrentItem() == 0)
                    myViewPager2.setCurrentItem(99, false);
                else if (myViewPager2.getCurrentItem() == 99) 
                    myViewPager2.setCurrentItem(0, false);
            }

I tried the code above in initView() after setting adapter but it doesn't work properly. for example when I swipe left from page 2, it directly goes to the last page and page 1 is skipped .The same thing happens when I swipe right to get to the last page and it directly goes to page 1. I just wanna make an infinite scrolling without skipping any pages.


Solution

  • you should post Adapters code, in there you should return Integer.MAX_VALUE in getCount and introduce proper fetching model for drawing list item - e.g. if you have ArrayList data then use data.get(position % data.getItemCount()) in getItem (as array have fixed size, but you are informing adapter about veeery large/infinite number of items)

    your current aproach isn't good, as you are manipulating Views positions, this for shure will add some visual glitches sooner or later, and also is not very efficient