先简单的聊一下ViewPager,默认它是会加载当前显示页和左右两侧的页面内容的。(所以一般使用ViewPager+Fragment的时候,尽量可以实现Fragment的懒加载,所以在这里给大家推荐一个框架Fragmention,反正我是看完这个代码感觉给自己打开了一个新天地),当然,刚才说的和本节内容一点关系也没有。
一般每一个APP上 基本都会有这么一个广告条。既然是广告条了,那就得有无限轮播的功能吧。而且我看当前还有很多人再用handler+timer在指定时间去切换线程。这样不太好吧。代码逻辑教乱。既然学了Rx当然要使用Rx来对这个事件进行操作了。而且看起来是那么简单。
我先贴Adapter的部分代码
@Override
public int getCount() {
//因为是无限轮播嘛,所以在总数量这里,欺骗一下Adapter
return Integer.MAX_VALUE;
}
同样,因为我们改变了count,所以对应的position也是从0- Integer.MAX_VALUE了
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.test,container,false);
//一般我会在这里判断一下position,因为我一般是先加载布局,数据用的是一个空集合
//当我真正从服务器中拿到数据之后,我会更新一下Adaper,所以当是空数据,就不处理了
if(lists.size() == 0){
return view;
}
//当从服务器获取到数据以后,开始循环,position对size取余可以得到0-size
position %= lists.size();
TextView tv = (TextView) view.findViewById(R.id.tv);
tv.setText(lists.get(position).getText());
container.addView(view);
return view;
}
至此,Adaper需要注意的地方就结束了。
先看一下这两个方法
//注册Rx事件,interval这个操作符是xx时间后做yy事
public void register(){
subscribe = Observable.interval(2, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1() {
@Override
public void call(Long aLong) {
//每过两秒我就展示的ViewPager当前页的下一页
mPager.setCurrentItem(mPager.getCurrentItem()+1,true);
//如果你们不调用unRegister,你们可以看看当程序退出之后,你们的Toast打印出来的数,能打到多少
Toast.makeText(MainActivity.this, "aLong="+aLong, Toast.LENGTH_SHORT).show();
}
});}
//取消Rx事件
public void unRegister(){
if(subscribe != null && !subscribe.isUnsubscribed())
subscribe.unsubscribe();
}
我一般会在生命周期的方法里面去调用注册和取消注册的方法。比如onResume和onPause
同时,mPager最好在设置完ViewPager后就指定显示再1000页。这样用户进去就可以左滑了。
同时
mPager.setAdapter(adapter);
mPager.setCurrentItem(10000,false);
mPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//监听ViewPager的触摸事件,当用户按下的时候取消注册,当用户手抬起的时候再注册,这样效果就完美了
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
unRegister();
break;
case MotionEvent.ACTION_UP:
register();
break;
}
return false;
}});