先簡單的聊一下ViewPager季率,默認它是會加載當前顯示頁和左右兩側(cè)的頁面內(nèi)容的野瘦。(所以一般使用ViewPager+Fragment的時候,盡量可以實現(xiàn)Fragment的懶加載飒泻,所以在這里給大家推薦一個框架Fragmention鞭光,反正我是看完這個代碼感覺給自己打開了一個新天地),當然泞遗,剛才說的和本節(jié)內(nèi)容一點關(guān)系也沒有惰许。
一般每一個APP上 基本都會有這么一個廣告條。既然是廣告條了史辙,那就得有無限輪播的功能吧汹买。而且我看當前還有很多人再用handler+timer在指定時間去切換線程。這樣不太好吧聊倔。代碼邏輯教亂晦毙。既然學了Rx當然要使用Rx來對這個事件進行操作了。而且看起來是那么簡單耙蔑。
我先貼Adapter的部分代碼
@Override
public int getCount() {
//因為是無限輪播嘛见妒,所以在總數(shù)量這里,欺騙一下Adapter
return Integer.MAX_VALUE;
}
同樣甸陌,因為我們改變了count,所以對應(yīng)的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须揣,因為我一般是先加載布局,數(shù)據(jù)用的是一個空集合
//當我真正從服務(wù)器中拿到數(shù)據(jù)之后钱豁,我會更新一下Adaper,所以當是空數(shù)據(jù)耻卡,就不處理了
if(lists.size() == 0){
return view;
}
//當從服務(wù)器獲取到數(shù)據(jù)以后,開始循環(huán)牲尺,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需要注意的地方就結(jié)束了。
先看一下這兩個方法
//注冊Rx事件秸谢,interval這個操作符是xx時間后做yy事
public void register(){
subscribe = Observable.interval(2, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
//每過兩秒我就展示的ViewPager當前頁的下一頁
mPager.setCurrentItem(mPager.getCurrentItem()+1,true);
//如果你們不調(diào)用unRegister凛澎,你們可以看看當程序退出之后,你們的Toast打印出來的數(shù)估蹄,能打到多少
Toast.makeText(MainActivity.this, "aLong="+aLong, Toast.LENGTH_SHORT).show();
}
});}
//取消Rx事件
public void unRegister(){
if(subscribe != null && !subscribe.isUnsubscribed())
subscribe.unsubscribe();
}
我一般會在生命周期的方法里面去調(diào)用注冊和取消注冊的方法塑煎。比如onResume和onPause
同時,mPager最好在設(shè)置完ViewPager后就指定顯示再1000頁臭蚁。這樣用戶進去就可以左滑了最铁。
同時
mPager.setAdapter(adapter);
mPager.setCurrentItem(10000,false);
mPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//監(jiān)聽ViewPager的觸摸事件,當用戶按下的時候取消注冊垮兑,當用戶手抬起的時候再注冊冷尉,這樣效果就完美了
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
unRegister();
break;
case MotionEvent.ACTION_UP:
register();
break;
}
return false;
}});
其實這篇文章水的毫無意義,唯一的意義也許就是向大家推薦了Fragmention系枪,這真的非常不錯雀哨,雖然和本文一點關(guān)系都沒有。
給大家推薦兩篇文章:
RX用法大集合:
http://blog.csdn.net/theone10211024/article/details/50435325
Fragmention作者的簡書:
http://www.reibang.com/users/6b372d09b617/latest_articles