无限循环,自动滚动的ViewPager

实现原理:在第一张图片前加一张最后一张图片,在最后一张图片后加一张第一张图片。在滚动到最后一张图片的时候让他默认指向第一张图片。

 

具体添加类如下,无需改变代码现有结构,只需要设置Viewpager类以及添加adpter即可。

 

package com.imfclub.stock.view;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;

/**
* Created by GuoJing on 2015/5/7.
*/
public class HeadViewPager extends ViewPager implements Runnable {

  private PagerAdapter pagerAdapter;

  private static final int POST_DELAYED_TIME = 1000 * 5;
  private boolean touching;

  private PagerAdapter myPagerAdapter;

  public HeadViewPager(Context context, AttributeSet attrs) {
  super(context, attrs);
  postDelayed(this, POST_DELAYED_TIME);
  }

  private class MyPagerAdapter extends PagerAdapter {
  private PagerAdapter pa;

  public MyPagerAdapter(PagerAdapter pa) {
    this.pa = pa;
  }

  @Override
  public int getCount() {
    return pa.getCount() > 1 ? pa.getCount() + 2 : pa.getCount();
  }

  @Override
  public Object instantiateItem(ViewGroup container, int position) {

    if (position == 0) {
      return pa.instantiateItem(container, pa.getCount() - 1);
    } else if (position == pa.getCount() + 1) {
      return pa.instantiateItem(container, 0);
    } else {
      return pa.instantiateItem(container, position - 1);
    }
  }

  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    pa.destroyItem(container, position, object);
   }

  @Override
  public boolean isViewFromObject(View arg0, Object arg1) {
    return pa.isViewFromObject(arg0, arg1);
  }
}

  private class MyOnPageChangeListener implements OnPageChangeListener {
  private OnPageChangeListener listener;
  private boolean alreadyTriggerOnPageSelected;

  public MyOnPageChangeListener(OnPageChangeListener listener) {
    this.listener = listener;
  }

  @Override
  public void onPageScrollStateChanged(int arg0) {
    if (arg0 == SCROLL_STATE_IDLE) {
      if (getCurrentItem() + 1 == 0) {
        setCurrentItem(pagerAdapter.getCount() - 1, false);
      } else if (getCurrentItem() + 1 == pagerAdapter.getCount() + 1) {
        setCurrentItem(0, false);
      }
    }

    listener.onPageScrollStateChanged(arg0);
  }

  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {
    listener.onPageScrolled(arg0, arg1, arg2);
  }

  @Override
  public void onPageSelected(int arg0) {
    if (arg0 == 0) {
      listener.onPageSelected(pagerAdapter.getCount() - 1);
      alreadyTriggerOnPageSelected = true;
    } else if (arg0 == pagerAdapter.getCount() + 1) {
      listener.onPageSelected(0);
      alreadyTriggerOnPageSelected = true;
    } else {
      if (!alreadyTriggerOnPageSelected) {
        listener.onPageSelected(arg0 - 1);
      }
      alreadyTriggerOnPageSelected = false;
    }

  }

}

  @Override
  public void setOnPageChangeListener(OnPageChangeListener listener) {
    super.setOnPageChangeListener(listener == null ? null
      : new MyOnPageChangeListener(listener));
  }

  @Override
  public void setAdapter(PagerAdapter arg0) {
    myPagerAdapter = arg0 == null ? null : new MyPagerAdapter(arg0);
     super.setAdapter(myPagerAdapter);

    if (arg0 != null && arg0.getCount() != 0) {
      setCurrentItem(0, false);
    }
    this.pagerAdapter = arg0;
  }

  @Override
  public PagerAdapter getAdapter() {
    return pagerAdapter;
   }

  public PagerAdapter getMyPagerAdapter() {
    return myPagerAdapter;
  }

  @Override
  public int getCurrentItem() {
    return super.getCurrentItem() - 1;
  }

  @Override
  public void setCurrentItem(int item) {
    setCurrentItem(item, true);
  }

  @Override
  public void setCurrentItem(int item, boolean smoothScroll) {
    super.setCurrentItem(item + 1, smoothScroll);
  }

  @Override
  public void run() {
  if (getAdapter() != null && getAdapter().getCount() > 1 && !touching) {
    setCurrentItem(getCurrentItem() + 1, true);
  }
  postDelayed(this, POST_DELAYED_TIME);
}

  @Override
  public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() == MotionEvent.ACTION_DOWN) {
    this.touching = true;
  } else if (event.getAction() == MotionEvent.ACTION_UP
    || event.getAction() == MotionEvent.ACTION_CANCEL) {
    this.touching = false;
  }

  return super.onTouchEvent(event);
}
}

 

 更新数据必须调用

public PagerAdapter getMyPagerAdapter() {
        return myPagerAdapter;
}
方法获取到的PagerAdapter

 

posted @ 2015-05-07 17:44  天津大学  阅读(510)  评论(0编辑  收藏  举报