How to do circular scrolling on ViewPager?

后端 未结 10 1552
别那么骄傲
别那么骄傲 2020-11-28 04:31

I would like to set my ViewPager to do circular scrolling. I want the first page to be able to scroll to page 2 AND the last page. And I would like my last page to scroll to

10条回答
  •  无人及你
    2020-11-28 05:03

    This is my solution:

    myViewPager.java

    public class myViewPager extends PagerAdapter {
    
        public myViewPager (Context context) {
            this.context = context;
        }
    
        @Override
        public int getCount() {
            return rank.length+2;
        }
    
        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }
    
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            // Declare Variables
    
            TextView textViewRank;
    
    
    
            //Log.i(TAG, "get position = "+position);
    
            inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View itemView = inflater.inflate(R.layout.viewpager_item, container,
                false);
    
            textViewRank= (TextView) itemView.findViewById(R.id.textView1);
    
            if (position == getCount() - 1) {
                textViewRank.setText(rank[0]);
            } else if (position == 0) {
                textViewRank.setText(rank[rank.length-1]);
            } else {
                textViewRank.setText(rank[position-1]);
            }
    
    
            ((ViewPager) container).addView(itemView);
    
            return itemView;
        }
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
    }
    

    viewpager_item.xml

    
    
    
        
    
    

    MainActivity.java

    public class MainActivity extends AppCompatActivity {
        private static final String TAG = MainActivity.class.getName();
        public static String[] rank;
        myViewPager adapter;
        private ViewPager viewPager;
        private static int currentPage;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            rank = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
            viewPager = (ViewPager) findViewById(R.id.view_pager);
            adapter = new myViewPager(this);
    
            viewPager.setAdapter(adapter);
    
            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                @Override
                public void onPageSelected(int position) {
                    Log.i(TAG, "onPageSelected = "+position);
                    currentPage = position;
                }
                @Override
                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                    // not needed
                }
                @Override
                public void onPageScrollStateChanged(int state) {
                    if (state == ViewPager.SCROLL_STATE_IDLE) {
                        int pageCount = rank.length+2;
    
                        if (currentPage == pageCount-1){
                            viewPager.setCurrentItem(1,false);
                        } else if (currentPage == 0){
                            viewPager.setCurrentItem(pageCount-2,false);
                        }
                    }
                }
            });
        }
    
    
    }
    

    activity_main.xml

    
    
    
        
    
    
    

    Assumed that the array has 10 elements. Then "add" 2 dummy elements, but not really add. When "get_count" function is called, just return size=10+2 elements.

    dummy e[0] e[1] e[2] e[3] e[4] e[5] e[6] e[7] e[8] e[9] dummy

    In viewPager.addOnPageChangeListener:

    when you slide to the last element, viewPager should set the first element as next.

    if (currentPage == pageCount-1){
        viewPager.setCurrentItem(1,false);
    }
    

    when you slide to the first element, viewPager should set the last element as next.

    else if (currentPage == 0){
        viewPager.setCurrentItem(pageCount-2,false);
    }
    

    In instantiateItem :

     if (position == getCount() - 1) {
        textViewRank.setText(rank[0]);
     } else if (position == 0) {
        textViewRank.setText(rank[rank.length-1]);    
     } else {
        textViewRank.setText(rank[position-1]);
     }
    

提交回复
热议问题