Android面試題-終極解決ViewPager.setCurrentItem中間頁面過多解決方案
自定義控制元件
- 一分鐘實現貼紙功能
- 一分鐘實現TextView高亮
- 一分鐘實現新手引導頁
- 一分鐘實現ViewPager卡片
- 一分鐘實現輪播圖
- 一分鐘實現GridView拖拽
- 一分鐘實現底部導航欄
- 一分鐘實現底部FragmentTabhost
- 一分鐘實現多張圖片選擇
- 一分鐘實現仿美拍直播的點贊動畫
- 一分鐘實現高仿今日頭條視訊列表
- 一分鐘實現購物車加減控制元件
- 一分鐘實現省市縣三級聯動
- 一分鐘實現二維碼生成和掃描
- 一分鐘實現沉浸式狀態列
- 一分鐘實現圖片裁剪
- 一分鐘實現視訊彈幕
- 一分鐘實現圖片縮放
- 一分鐘實現旋轉選擇器
- 一分鐘實現ofo小黃車的引導介面
- 一分鐘實現自定義ImageView外貌
- 一分鐘實現向左拖拽跳轉詳情頁
- 一分鐘實現QQ首頁動畫特效
- 一分鐘實現ViewPager上下滑動
聯網
工具
資料庫
原始碼分析相關面試題
Activity相關面試題
- 儲存Activity的狀態
- 深刻剖析activity啟動模式(一)
- 深刻剖析activity啟動模式(二)
- 深刻剖析activity啟動模式(三)
- Activity Task和Process之間的關係
- 原始碼分析service開啟Activity拋異常?activity不會拋異常
- Activity優雅退出
- onCreate原始碼分析
Service相關面試題
與XMPP相關面試題
與效能優化相關面試題
與登入相關面試題
與開發相關面試題
- 迭代開發的時候如何向前相容新舊介面
- 手把手教你如何解決as jar包衝突
- context的原理分析
- 解決ViewPager.setCurrentItem中間很多頁面切換方案
- 字型適配
- 軟鍵盤適配
- 機型適配,例如三星、小米、華為、魅族等
- CardView 設定水波紋效果
與人事相關面試題
本文配套視訊
今天做專案用ViewPager.setCurrentItem 方法,如果兩個頁面相聚比較遠,就會閃瞎我的鈦合金雙眼,中間切換大概20個頁面,如下所示:
setCurrentItem第二個引數設定false,四不四很簡單,直接使用如下程式碼:
ViewPager.setCurrentItem(position,false);
很不幸的是,使用上面的程式碼會出現如下效果,扎心了老鐵:
從第一題點選切換到第十八題,你會發現頁面顯示空白,如果從第十個頁面切換到第十五個頁面沒事,平時大家估計沒有發現這個bug,一般我們使用ViewPager都是底下5個tab頁面,從第一個切換到第五個沒事,之前我也以為把第二個引數設定false就行,今天才發現,原來如果當頁面比較少的時候,大概十個以內,一般沒有問題,如果超過十個頁面切換就會出現空白,載入不了資料,扎心了,提出解決方案吧,ViewPager滑動使用的是Scroll,我們們把Scroll的滑動時間duration 設定為0就行。
自定義一個Scroll類,用於控制ViewPager滑動速度:
public class MScroller extends Scroller {
private static final Interpolator sInterpolator = new Interpolator() {
public float getInterpolation(float t) {
t -= 1.0f;
return t * t * t * t * t + 1.0f;
}
};
public boolean noDuration;
public void setNoDuration(boolean noDuration) {
this.noDuration = noDuration;
}
public MScroller(Context context) {
this(context,sInterpolator);
}
public MScroller(Context context, Interpolator interpolator) {
super(context, interpolator);
}
@Override
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
if(noDuration)
//介面滑動不需要時間間隔
super.startScroll(startX, startY, dx, dy, 0);
else
super.startScroll(startX, startY, dx, dy,duration);
}
}
上面程式碼可知:
1)動態判斷頁面是否需要滑動,如果不需要滑動,設定滑動時間為0;
為方便使用,定義一個輔助類
public class ViewPageHelper {
ViewPager viewPager;
MScroller scroller;
public ViewPageHelper(ViewPager viewPager) {
this.viewPager = viewPager;
init();
}
public void setCurrentItem(int item){
setCurrentItem(item,true);
}
public MScroller getScroller() {
return scroller;
}
public void setCurrentItem(int item, boolean somoth){
int current=viewPager.getCurrentItem();
//如果頁面相隔大於1,就設定頁面切換的動畫的時間為0
if(Math.abs(current-item)>1){
scroller.setNoDuration(true);
viewPager.setCurrentItem(item,somoth);
scroller.setNoDuration(false);
}else{
scroller.setNoDuration(false);
viewPager.setCurrentItem(item,somoth);
}
}
private void init(){
scroller=new MScroller(viewPager.getContext());
Class<ViewPager>cl=ViewPager.class;
try {
Field field=cl.getDeclaredField("mScroller");
field.setAccessible(true);
//利用反射設定mScroller域為自己定義的MScroller
field.set(viewPager,scroller);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}catch (IllegalAccessException e){
e.printStackTrace();
}
}
}
由上面程式碼可知:
1)Math.abs(current-item)>1 ,通過數學函式判斷頁面相隔大於1,就設定頁面切換的動畫的時間為0。
2)這樣每次設定頁面的時候,通過 helper 就可以自動選擇是否有時間間隔了。
3)但是這樣有點麻煩,每次還要手動改,而且使用TabLayout或者ViewPagerIndicator的話,它會自動呼叫ViewPager的方法,無法使用Helper,所以可以採用自定一個ViewPager,程式碼如下:
public class SuperViewPager extends ViewPager {
private ViewPageHelper helper;
public SuperViewPager(Context context) {
this(context,null);
}
public SuperViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
helper=new ViewPageHelper(this);
}
@Override
public void setCurrentItem(int item) {
setCurrentItem(item,true);
}
@Override
public void setCurrentItem(int item, boolean smoothScroll) {
MScroller scroller=helper.getScroller();
if(Math.abs(getCurrentItem()-item)>1){
scroller.setNoDuration(true);
super.setCurrentItem(item, smoothScroll);
scroller.setNoDuration(false);
}else{
scroller.setNoDuration(false);
super.setCurrentItem(item, smoothScroll);
}
}
}
至此完美解決了,ViewPager.setCurrentItem切換頁面,效果如下:
歡迎關注微信公眾號,長期推薦技術文章和技術視訊
微信公眾號名稱:Android乾貨程式設計師
相關文章
- JavaWeb 亂碼問題終極解決方案!JavaWeb
- Android App程式碼混淆終極解決方案AndroidAPP
- 全文Feed的終極解決方案
- JSP中文亂碼問題終極解決方案JS
- H5定位終極解決方案H5
- Exception in thread “main” 終極解決方案ExceptionthreadAI
- 前端(React)生成pdf終極解決方案(^_^)前端React
- mac php環境終極解決方案MacPHP
- asp.net Ajax 終極解決方案ASP.NET
- 終極自託管解決方案指南
- JSP中文亂碼問題終極解決方案(上)JS
- SecureCRT 下MySQL中文亂碼問題終極解決方案SecurecrtMySql
- WordPress中實現Markdown編輯的終極解決方案
- 快取熱點,快取穿透,終極解決方案看過來快取穿透
- [iOS]終極橫豎屏切換解決方案iOS
- web app 無限載入終極解決方案WebAPP
- YII2.0 jQuery(…).activeform is not a function in 終極解決方案jQueryORMFunction
- Loguru:Python 日誌終極解決方案Python
- 禁止web頁面縮放解決方案Web
- iframe父子頁面通訊解決方案
- 頁面間通訊與資料共享解決方案簡析
- Android SDK無法更新終極解決方式Android
- INSTALL_FAILED_NO_MATCHING_ABIS終極解決方案AI
- JavaScript 資料型別檢測終極解決方案JavaScript資料型別
- JS HTTP 請求終極解決方案 - fly.jsJSHTTP
- jive 漢字問題終極解決辦法
- golang定時任務踩坑及終極解決方案Golang
- Mac無法清倒廢紙簍,終極解決方案Mac
- 關於開發者協議Edit Phone Number終極解決方案協議
- Windows7開機桌面黑屏故障終極解決方案Windows
- 單元件多UI形態的終極解決方案(React)元件UIReact
- Vuex資料頁面重新整理丟失問題解決方案Vue
- SVG多解析度、自適應縮放解決方案SVG
- 手機端頁面自適應解決方案
- Linux中文亂碼問題終極解決方法Linux
- 下拉選單「點選外面關閉」的終極解決方案
- Navicat Premium for Mac:多資料庫管理的終極解決方案REMMac資料庫
- Spring Cloud分散式事務終極解決方案探討SpringCloud分散式