記得最初使用ViewPager實現無限輪播大體是這樣的.前端
class BannerPagerAdapter extends PagerAdapter { List<View> list; @Override public int getCount() { return Integer.MAX_VALUE; } @Override public Object instantiateItem(ViewGroup container, final int position) { int realPosition = position%list.size(); return list.get(realPosition); } }
在使用了開源庫Banner後,感受這個庫處理無限輪播,寫的很是好.git
這個庫能夠左右無限滑動,也能夠自動左右無限輪播.github
首先先了解下,其大體原理.ide
在數據的先後兩端各添加一條數據.前端添加的是最後一天數據,尾端添加的是第一條數據.如圖:
動畫
當從C滑動到D時,在ViewPager.OnPageChangeListener#onPageScrollStateChanged()中作監聽並快速切換到A;
當從A滑動到E時,在ViewPager.OnPageChangeListener#onPageScrollStateChanged()中作監聽並快速切換到C;
這裏切換使用viewPager.setCurrentItem(int,boolean);第二個參數爲false,表示不使用動畫,直接快速切換,形成一種無限輪播的假象.spa
而後在ViewPager.OnPageChangeListener中作監聽處理並快速切換.code
//當前頁面索引 int currentIndex = 1; //數據源的實際大小 int pageCount; private ViewPager.OnPageChangeListener onPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentIndex = position; } @Override public void onPageScrollStateChanged(int state) { //在這裏作快速切換,當你滑動到首位,要快速切換到尾端 if (currentIndex==0){ viewPager.setCurrentItem(pageCount,false); } //當你滑動到尾端,要快速切換到首位 if (currentIndex==pageCount+1){ viewPager.setCurrentItem(1,false); } } };