2014-09-25 13 views
6

So che posso fareAndroid - ViewPager adattatore, impostare la voce primaria prima adattatore viene creata un'istanza

viewPager.setCurrentItem(position) 

per impostare mio avviso cercapersone nella posizione desiderata. La mia domanda è se e come posso fare questo prima che l'adattatore viene creata un'istanza.

Il che significa che se lo faccio

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

collo 0 è prima build e dopo che l'oggetto nella posizione desiderata anche a costruire. Che prende il doppio del tempo ... Nel mio adattatore ogni elemento ha bisogno di un bel po 'di lavoro per essere costruire, quindi sarebbe meglio evitare il collo 0 posizione da costruire, se possibile. Forse facendo passare nella posizione desiderata come un argomento a esemplificazione della scheda ...?

Un modo per farlo?

risposta

1

si può ingannare il viewpager per iniziare in una data posizione prima che l'adattatore è impostato, chiamando onRestoreInstanceState, in questo modo:

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

Purtroppo questo non funziona più in Android M, vedere la mia nuova risposta –

+0

Aggiornato per funzionare con Android M –

3

Se il tempo e il lavoro è quello che stai preoccupare, mi piacerebbe provare a evitare di costruire la pagina alla posizione 0 fino a quello desiderato è stato costruito. Si potrebbe utilizzare una variabile permette di dire "desiredPageHasBeenBuilt" l'adattatore, quando si richiede la voce alla posizione 0 si potrebbe restituite un "pagina vuota" se la desiredPageHasBeenBuilt variabile è falsa, quando la pagina desiderata è stato costruito impostare la variabile su true e la la pagina 0 può essere costruita.

0

si può fare questo trucco:

refactoring tutto il lavoro pesante in una funzione, perché la creazione di un fragment non è richiede molto tempo, ed eseguire solo la funzione quando l'utente sta per vederlo chiamando quella funzione all'interno OnPageChangeListener ascoltatore e allo

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

Per una soluzione che funziona in Android M, così come le versioni precedenti, l'uso di riflessione come segue:

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

Utilizzando riflessione è sicuro, perché è possibile controllare l'attuazione ViewPager (è incluso con l'app).

Se si utilizza Proguard, allora avete bisogno di includere le seguenti nella sua configurazione:

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

o il campo mRestoredCurItem sarà ridenominato da Proguard.

3

Si può solo impostare l'adattatore in bianco e dopo che impostare il tuo vero adattatore questo modo si "ingannare" il viewpager e si desidera caricare tutti i dati che non volete.

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