如何實(shí)現(xiàn)循環(huán)播放
現(xiàn)在網(wǎng)上實(shí)現(xiàn)循環(huán)播放都是在adapter的getCount()方法返回一個(gè)較大的值并且instantiateItem(ViewGroup container, int position)中通過取余(position/datas.size())的方式,讓ViewPager不斷的播放下去。
這里我們通過修改數(shù)據(jù)源和設(shè)置currentItem的方式實(shí)現(xiàn)。
修改數(shù)據(jù)源:
final List<Integer> datas = new ArrayList<>();//這里添加測(cè)試數(shù)據(jù),實(shí)際項(xiàng)目中可以是從網(wǎng)絡(luò)獲取數(shù)據(jù) datas.add(R.mipmap.welcome_page_01); datas.add(R.mipmap.welcome_page_02); datas.add(R.mipmap.welcome_page_03); //處理數(shù)據(jù)源 datas.add(0,datas.get(datas.size()-1)); datas.add(datas.get(1));
設(shè)置currentItem需要在OnPageChangeListener對(duì)象中進(jìn)行:
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if(position==0){ mViewPager.setCurrentItem(datas.size()-2,false); }else if(position==datas.size()-1){ mViewPager.setCurrentItem(1,false); } } @Override public void onPageScrollStateChanged(int state) { } });Adapter和一般的ViewPager的Adapter一樣即可。
如何實(shí)現(xiàn)自動(dòng)循環(huán):
實(shí)現(xiàn)自動(dòng)循環(huán),方法比較多,比如Timer,Handler,Alarm等等。這里我們使用Handle的方式
自定義Handler類如下:
public class BannerHander extends Handler{ @Override public void handleMessage(Message msg) { if(msg.what==1){ mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1); sendEmptyMessageDelayed(1,3000); } } }獲取數(shù)據(jù),給ViewPager設(shè)置Adapter之后就可以啟動(dòng)自動(dòng)循環(huán):
if(!(mHandler!=null && mHandler.get()!=null)){ mHandler = new WeakReference<BannerHander>(new BannerHander());}mHandler.get().sendEmptyMessageDelayed(1, 300);這里我們是用了弱引用,主要是為了防止出現(xiàn)內(nèi)存溢出。
注意:
在設(shè)置CurrentItem時(shí)一定要在OnPageChangeListener中進(jìn)行,Adapter的finishUpdate(View view)中設(shè)置會(huì)出現(xiàn)白屏的情況。如果哪位大神知道,麻煩指教下。
新聞熱點(diǎn)
疑難解答
圖片精選