viewpager实现无限循环滚动幻灯片

一直想做循环滑动幻灯片的效果,类似pptv等的首页效果十分抱歉,不会整gif动图~~~抓狂

废话少说,先上图看效果:

  


思路是:设置pageradapter的count为Integer.MAX_VALUE,但实际的item只有几个,用取余的方式取item,在设置adapter时同时设置currentItem为实际item数的N倍(足够大就好)。这样就可以左右无缝循环滑动!(毕竟你不可能滑上亿次),并且不用担心内存问题,就那几个玩意~~~


这里不能用FragmentPagerAdapter或FragmentStatePagerAdapter,因为这两个的item是fragment,他们有自己的fragment管理机制,要是用,getFragment()返回同一个fragment(指针一样)就会报错,不信就试试~~~

要继承PagerAdapter,使用view作为item,重写必要的方法。。。

图上右下角的指示器并不是我做的,但我稍微修改了一下,使他使用于我的“无限循环方式”。

废话太多了,上部分源码:

这是adapter的:

/**
 * 自定义视图幻灯片 适配器
 * 无限循环
 * @author hezb
 */
public class CustomViewPagerAdapter extends PagerAdapter{

	private final String TAG = "hezb";

	private int realCount = 0;

	private ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
			ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

	private List<View> viewList;
	
	/**
	 * 传入 自定义 view 的列表
	 */
	public CustomViewPagerAdapter(List<View> viewList) {
		if (viewList == null) {
			Log.e(TAG, "CustomViewPagerAdapter   viewList is null!");
			return;
		}
		realCount = viewList.size();
		this.viewList = viewList;
		for (int i = 0; i < viewList.size(); i++) {
			viewList.get(i).setLayoutParams(lp);
		}
	}

	@Override
	public int getCount() {
		return realCount == 0 ? 0 : Integer.MAX_VALUE;
	}
	/**
	 * @return 实际的 item 数
	 */
	public int getRealCount(){
		return realCount;
	}

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

	@Override
	public Object instantiateItem(View container, int position) {
		position = position % realCount;
		try {
			((ViewPager) container).addView(viewList.get(position));
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

		return viewList.get(position);
	}

	@Override
	public Object instantiateItem(ViewGroup container, int position) {
		position = position % realCount;
		try {
			((ViewPager) container).addView(viewList.get(position));
		} catch (Exception e) {
			Log.e(TAG, e.getMessage());
		}

		return viewList.get(position);
	}

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

}

唉,表达能力有待提高,直接下工程文件看看吧!

点击下载!!!




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值