Android 使用 ViewPager循环广告位的实现
如何实现循环播放
现在网上实现循环播放都是在adapter的getCount()方法返回一个较大的值并且instantiateItem(ViewGroupcontainer,intposition)中通过取余(position/datas.size())的方式,让ViewPager不断的播放下去。
这里我们通过修改数据源和设置currentItem的方式实现。
修改数据源:
finalList<Integer>datas=newArrayList<>(); //这里添加测试数据,实际项目中可以是从网络获取数据 datas.add(R.mipmap.welcome_page_01); datas.add(R.mipmap.welcome_page_02); datas.add(R.mipmap.welcome_page_03); //处理数据源 datas.add(0,datas.get(datas.size()-1)); datas.add(datas.get(1));
设置currentItem需要在OnPageChangeListener对象中进行:
mViewPager.setOnPageChangeListener(newViewPager.OnPageChangeListener(){
@Override
publicvoidonPageScrolled(intposition,floatpositionOffset,intpositionOffsetPixels){
}
@Override
publicvoidonPageSelected(intposition){
if(position==0){
mViewPager.setCurrentItem(datas.size()-2,false);
}elseif(position==datas.size()-1){
mViewPager.setCurrentItem(1,false);
}
}
@Override
publicvoidonPageScrollStateChanged(intstate){
}
});
Adapter和一般的ViewPager的Adapter一样即可。
如何实现自动循环:
实现自动循环,方法比较多,比如Timer,Handler,Alarm等等。这里我们使用Handle的方式
自定义Handler类如下:
publicclassBannerHanderextendsHandler{
@Override
publicvoidhandleMessage(Messagemsg){
if(msg.what==1){
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
sendEmptyMessageDelayed(1,3000);
}
}
}
获取数据,给ViewPager设置Adapter之后就可以启动自动循环:
if(!(mHandler!=null&&mHandler.get()!=null)){
mHandler=newWeakReference<BannerHander>(newBannerHander());
}
mHandler.get().sendEmptyMessageDelayed(1,300);
这里我们是用了弱引用,主要是为了防止出现内存溢出。
注意:
在设置CurrentItem时一定要在OnPageChangeListener中进行,Adapter的finishUpdate(Viewview)中设置会出现白屏的情况。如果哪位大神知道,麻烦指教下。