如何实现循环播放
现在网上实现循环播放都是在adapter的getCount()方法返回一个较大的值并且instantiateItem(ViewGroup container, int position)中通过取余(position/datas.size())的方式,让ViewPager不断的播放下去。
这里我们通过修改数据源和设置currentItem的方式实现。
修改数据源:
1
2
3
4
5
6
7
8
|
final List<Integer> datas = new ArrayList<>();
//这里添加测试数据,实际项目中可以是从网络获取数据
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对象中进行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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一样即可。
如何实现自动循环:
实现自动循环,方法比较多,比如Timer,Handler,Alarm等等。这里我们使用Handle的方式
自定义Handler类如下:
1
2
3
4
5
6
7
8
9
|
public class BannerHander extends Handler{
@Override
public void handleMessage(Message msg) {
if (msg.what== 1 ){
mViewPager.setCurrentItem(mViewPager.getCurrentItem()+ 1 );
sendEmptyMessageDelayed( 1 , 3000 );
}
}
}
|
获取数据,给ViewPager设置Adapter之后就可以启动自动循环:
1
2
3
4
|
if (!(mHandler!= null && mHandler.get()!= null )){
mHandler = new WeakReference<BannerHander>( new BannerHander());
}
mHandler.get().sendEmptyMessageDelayed( 1 , 300 );
|
这里我们是用了弱引用,主要是为了防止出现内存溢出。
注意:
在设置CurrentItem时一定要在OnPageChangeListener中进行,Adapter的finishUpdate(View view)中设置会出现白屏的情况。如果哪位大神知道,麻烦指教下。