Android架构师谈:View-Pager-性能优化之-无限循环
作者:享學(xué)課堂Alvin老師
轉(zhuǎn)載請聲明出處!
ViewPager實現(xiàn)無限滑動
**方案一:**將viewpager上限設(shè)置成一個很大的數(shù),第一個頁面設(shè)置到中間。然后滑動的時候,用當前的序號與viewpager頁面數(shù)取余得到目標頁面的序號,然后顯示出來。理論上一個人不會無聊到一直左滑或者右滑。因此可以模擬無限循環(huán)。
**方案二:**假設(shè)viewpager中有四個頁面,分別為A、B、C、D。然后在A左邊添加一個頁面D,在D右邊添加一個頁面A,變成 D、A、B、C、D、A。當滑到D時跳轉(zhuǎn)到D,滑到A時跳轉(zhuǎn)到A。
第一種并不是實現(xiàn)了真正意義上的無限循環(huán),但是效果比較好,頁面切換的時候也不會出現(xiàn)跳轉(zhuǎn)閃爍的情況。
第二種雖然是真正的無限循環(huán),但是需要在開頭結(jié)尾添加元素,這樣就會造成其他問題,比如圖片下方跟隨圖片切換的小圓點的設(shè)置就會比較復(fù)雜。更新數(shù)據(jù)的時候也比較費勁。而且還會在切換頁面時出現(xiàn)閃爍,影響用戶體驗。因此選擇第一種實現(xiàn)方案。
第一種方案又會有兩種實現(xiàn):實現(xiàn)A,實現(xiàn)B
實現(xiàn)A:
實現(xiàn)過程:直接在getItem和 getCount中修改
@Override public Fragment getItem(int i) {return fragmentList.get(i% fragmentList.size()); } @Override public int getCount() {return Integer.MAX_VALUE; }暴露異常:出現(xiàn)bug
java.lang.IllegalStateException: Fragment already activeat android.support.v4.app.Fragment.setInitialSavedState(Fragment.java:620)at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem(FragmentStatePagerAdapter.java:117)修改方案: Fragment 數(shù)量不能低于4個,給viewPager添加了一個fragment問題解決。
實現(xiàn)B:
同樣的,讓后再Fragment 數(shù)量是4個的基礎(chǔ)上繼續(xù)實現(xiàn)方案的另一個實現(xiàn)B:
@Override public Fragment getItem(int i) {//在這里不處理position的原因是因為getItem方法在 //instantiateItem方法中調(diào)用。只要在調(diào)用前處理 //position即可,以免重復(fù)處理return fragmentList.get(i); } @NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {position = position % fragmentList.size();return super.instantiateItem(container, position); } @Overridepublic int getCount() {return Integer.MAX_VALUE; } @Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {position = position % fragmentList.size();super.destroyItem(container, position, object); }以上實現(xiàn)A和實現(xiàn)B均只能實現(xiàn)右滑的效果,無法實現(xiàn)無限左滑,這個是為什么呢?
解決辦法,在ViewPager配置的地方添加一行代碼:
mViewPager.setCurrentItem(fragmentList.size() * 100);這樣就解決了不能左滑的問題,因為用戶不會死死的循環(huán)幾百次,而這個數(shù)字確實可以保證用戶左右死循環(huán)般的存在。
最后
一次偶然,從朋友那里得到一份“java高分面試指南”,里面涵蓋了25個分類的面試題以及詳細的解析:JavaOOP、Java集合/泛型、Java中的IO與NIO、Java反射、Java序列化、Java注解、多線程&并發(fā)、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、數(shù)據(jù)結(jié)構(gòu)、算法、Elasticsearch 、Kafka 、微服務(wù)、Linux。
這不,馬上就要到招聘季了,很多朋友又開始準備“金三銀四”的春招啦,那我想這份“java高分面試指南”應(yīng)該起到不小的作用,所以今天想給大家分享一下。
請注意:關(guān)于這份“java高分面試指南”,每一個方向?qū)n}(25個)的題目這里幾乎都會列舉,在不看答案的情況下,大家可以自行測試一下水平 且由于篇幅原因,這邊無法展示所有完整的答案解析
這份“java高分面試指南”,每一個方向?qū)n}(25個)的題目這里幾乎都會列舉,在不看答案的情況下,大家可以自行測試一下水平 且由于篇幅原因,這邊無法展示所有完整的答案解析
資料領(lǐng)取方式:點擊【java高分面試指南-25大專題分類】
總結(jié)
以上是生活随笔為你收集整理的Android架构师谈:View-Pager-性能优化之-无限循环的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 市面上的会议平板牌子:Maxhub,华为
- 下一篇: 7天拿到阿里Android岗位offer