2014-09-25 23 views
6

Ich weiß, dass ich tun kann,Android - ViewPager Adapter, stellte primäres Element vor Adapter instanziiert

viewPager.setCurrentItem(position) 

meine Ansicht Pager an der gewünschten Position. Meine Frage ist, ob und wie ich dies tun kann, bevor der Adapter instanziiert wird.

Bedeutung, wenn ich tue

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

Artikel 0 erster Build ist und nach, dass das Element an der gewünschten Position baut ebenfalls. Das dauert doppelt so lange ... In meinem Adapter benötigt jeder Gegenstand ziemlich viel Arbeit, also sollte man am besten vermeiden, dass der 0-Positions-Gegenstand wenn möglich gebaut wird. Vielleicht indem man die gewünschte Position als Argument bei der Instantiierung des Adapters übergibt ...?

Jeder Weg, das zu tun?

Antwort

1

können Sie die viewpager täuschen an einer bestimmten Position zu starten, bevor der Adapter eingestellt ist, durch onRestoreInstanceState Aufruf wie folgt aus:

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

Leider funktioniert das nicht mehr in Android M, siehe meine neue Antwort –

+0

aktualisiert, um mit Android M zu arbeiten –

3

Wenn Sie sich um die Zeit und die Arbeit kümmern, würde ich versuchen, die Seite an Position 0 zu erstellen, bis die gewünschte Seite erstellt wurde. Sie könnten eine Variable verwenden, sagen wir "willedPageHasBeenBuilt" in Ihrem Adapter, wenn Sie das Element an Position 0 anfordern, könnten Sie eine "leere Seite" zurückgeben, wenn die Variable willedPageHasBeenBuilt false ist, wenn die gewünschte Seite erstellt wurde, setzen Sie die Variable auf true und die Seite 0 kann gebaut werden.

0

Sie diesen Trick tun können:

refactor alle Ihre schwere Arbeit in eine Funktion, weil eine fragment Erstellung nicht braucht viel Zeit, und nur die Funktion ausführen, wenn der Benutzer es sehen wird durch diese Funktion aufrufen innerhalb OnPageChangeListener Hörer und am

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

Für eine Lösung, die in Android M sowie älteren Versionen, die Verwendung Reflexion wie folgt funktioniert:

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); 

Mit Reflexion ist sicher, da Sie steuern die ViewPager Implementierung (es ist, die mit Ihrem app).

Wenn Sie Proguard verwenden, dann müssen Sie die folgende in seiner Konfiguration enthalten:

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

oder das Feld mRestoredCurItem wird durch Proguard umbenannt werden.

3

Sie können nur leeren Adapter setzen und danach Ihren realen Adapter auf diese Weise setzen Sie den Viewpager "trick" und Sie wollen alle Daten laden, die Sie nicht wollen.

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); 
Verwandte Themen