android ViewPager+Fragment封装无限循环ViewPager

    ViewPager本身并不支持无限循环,网络关于无限循环的原理主要有两种:1.假的无限循环;2.取最大值方案。第2种方案没尝试,本文采用第一种方案封装了一个可无限循环的ViewPager,用于Fragment的无限循环,同样也应该适用于View的无限循环,只需适配用于PagerAdapter即可(Fragment适配FragmentPagerAdapter)。该方案在FragmentActivity中进行封装,原理如下:

    在集合的第一个位置和最后 个位置分别添加最后一个数据要表现的界面和第一数据要表现的界面,如图:

5  0  1  2  3  4  5  0   

    下面讲CircularFragmentActivity的具体封装,代码如下:

/**
 * CircularViewPagerActivity
 * 封装了循环ViewPager的FragmentActivity
 * 
 * 

扩展方式如下: * 1-2-3-4-5 (扩展前的标准fragments) * 扩展5-1-2-3-4-5-扩展1 (首末位扩展后的fragments) * 扩展5与5(同理扩展1与1)不能指向同一Fragment,否则会报错 * *

{@link #initViewPager(int, ArrayList)} 中的参数ArrayList fragments为扩展后的fragments */ public class CircularViewPagerActivity extends FragmentActivity { /** * 首末位扩展后fragments的大小,等于导航条的size加2 */ private int size ; protected ViewPager viewPager ;//可以在子类中直接调用 private OnPageChangeListener listener ; /** * @param viewPagerId ViewPager的id * @param fragments 首末位扩展的后fragments */ protected void initViewPager(int viewPagerId,ArrayList fragments){ size = fragments.size() ; viewPager = (ViewPager)findViewById(viewPagerId) ; viewPager.setAdapter(new CircularFragmentPagerAdapter(getSupportFragmentManager(), fragments)) ; //启动ViewPager时从position=1的item开始,而不是显示首位添加的Fragment viewPager.setCurrentItem(1); viewPager.setOnPageChangeListener(new OnPageChangeListener() { /** * 循环控制全在此处控制 : * 循环原理在此监听方法中实现,当即将要显示首位扩展的item时,通过调用viewPager.setCurrentItem(position,false) * 以无动画的方式跳转到相应的item上 */ @Override public void onPageSelected(int position) {//position表示在扩展Fragments中即将要显示的Fragment的索引 if(position == 0){//首位扩展的item //延迟执行才能看到动画 new Handler().postDelayed(new Runnable() { @Override public void run() { viewPager.setCurrentItem(size-2,false) ;//跳转到末位 } }, 50) ; }else if(position ==size-1){//末位扩展的item //延迟执行才能看到动画 new Handler().postDelayed(new Runnable() { @Override public void run() { viewPager.setCurrentItem(1,false) ;//跳转到首位 } }, 50) ; } if(null != listener){ listener.onPageSelected(position) ; } } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if(null != listener){ listener.onPageScrolled(position, positionOffset, positionOffsetPixels) ; } } @Override public void onPageScrollStateChanged(int state) { if(null != listener){ listener.onPageScrollStateChanged(state) ; } } }); } /** * 通过扩展fragments中元素的索引来计算对应扩展前fragments集合中的索引 * @param broadenPosition 扩展fragments中的position * @param size 扩展前fragments的大小,等于导航条的大小,等于扩展后fragments的大小减2 * @return 标准fragments集合中的position */ protected int getRealPosition(int broadenPosition,int size){ int position ; if(broadenPosition==0){ position = size-1 ; }else if(broadenPosition==size+1){ position = 0 ; }else{ position=broadenPosition-1 ; } return position ; } /** * 给ViewPager设置OnPageChangeListener监听器 */ protected void setOnPageChangeListener(OnPageChangeListener l){ listener = l ; } }


使用demo:http://download.csdn.net/detail/u013510345/8091287

你可能感兴趣的:(android应用日报)