您的位置:首页 > 其它

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

2015-01-08 20:31 561 查看
一直想做循环滑动幻灯片的效果,类似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);
}

}


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

点击下载!!!



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息