2014-09-25 60 views
6

我知道我可以做的Android - ViewPager適配器,適配器之前設置的主項被實例化

viewPager.setCurrentItem(position) 

,在需要的位置設置我的看法尋呼機。我的問題是,如果和如何在適配器實例化之前做到這一點。

也就是說,如果我做

pagerAdapter = new ViewPagerAdapter(arg1,arg2....); 
viewPager.setAdapter(pagerAdapter); 
viewPager.setCurrentItem(position); 

項目0是第一個構建之後,在所需位置的項目也被建立。這需要兩倍的時間......在我的適配器中,每個項目都需要構建很多工作,因此如果可能,最好避免構建0位置項目。也許通過在適配器的實例化處傳遞期望的位置作爲參數...?

任何方式來做到這一點?

回答

1

你可以欺騙viewpager在給定的位置,開始之前將適配器設置,通過調用onRestoreInstanceState,像這樣:

int currentItem = 5; 

Parcel parcel = Parcel.obtain(); 
writeParcelable(BaseSavedState.EMPTY_STATE, 0); 

writeInt(currentItem); 
writeParcelable(null, 0); 

setDataPosition(0); 
SavedState savedState = ViewPager.SavedState.CREATOR.createFromParcel(parcel); 

mPager.onRestoreInstanceState(savedState); 

mPager.setAdapter(mAdapter); 
+0

不幸的是,這在Android M中不再適用,請參閱我的新答案 – 2015-09-03 23:01:28

+0

已更新,以使用Android M – 2015-09-08 13:26:54

3

如果時間和工作是你所擔心的,我會盡量避免在位置0處構建頁面,直到構建好所需的頁面。你可以在你的適配器中使用一個變量讓你說「desiredPageHasBeenBuilt」,當請求在位置0的項目時,如果變量desiredPageHasBeenBuilt爲false,當你想要的頁面已經建立時,你可以返回一個「空白頁面」第0頁可以建立。

0

你可以做到這招:

重構所有繁重的工作到一個函數的,因爲建立一個fragment是不是要花很多時間,並且只通過調用函數執行該功能時,用戶會看到它裏面OnPageChangeListener監聽器,並在

@Override 
public void onPageSelected(int position){ 
    // call your function that do heavy working 
} 
1

對於在版本的Android M以及舊版本,使用反射如下工作的解決方案:

int currentItem = 5; 

// Set initial position first... 
Field field = ViewPager.class.getDeclaredField("mRestoredCurItem"); 
field.setAccessible(true); 
field.set(mPager, currentItem); 

// ...and then set adapter 
mPager.setAdapter(adapter); 

使用反射是安全的,因爲您可以控制ViewPager實現(它包含在你的應用程序)。

如果您使用Proguard的,那麼你就需要在其配置如下:

-keepclassmembers class android.support.v4.view.ViewPager { 
    private int mRestoredCurItem; 
} 

或現場mRestoredCurItem將Proguard的改名。

3

您可以設置空白適配器,然後以這種方式設置真正的適配器,您將「欺騙」viewpager,並且希望加載任何您不想要的數據。

this.viewPager.setAdapter(new PagerAdapter() { 
     @Override 
     public int getCount() { 
      return 0; 
     } 

     @Override 
     public boolean isViewFromObject(View view, Object object) { 
      return false; 
     } 
    }); 
this.viewPager.setCurrentItem(imagePosition, false); 
this.viewPager.setAdapter(adapter); 
this.viewPager.setCurrentItem(imagePosition, false);