2012-08-09 14 views
50

ich das folgende Beispiel bin mit meinem viewPager impliment: http://code.google.com/p/viewpagerexample/issues/listPagerAdapter Startposition

Das Problem bei diesem Beispiel ist, dass ich nicht herausfinden kann, wie meine Ausgangsposition zu setzen, die Standard-Ausgangsposition ist 0 Grundsätzlich möchte ich kontrollieren können, ob links oder rechts eine freie Sicht besteht.

Gibt es eine Möglichkeit, die aktuelle Position des Control Centers anzuzeigen? Gibt es einen besseren Weg, es zu tun? ist es möglich, es kreisförmig zu machen?

Antwort

121

Ich habe einen Weg gefunden, um es einrichten Position ist, die außerhalb der Klasse getan wird:

awesomePager = (ViewPager) findViewById(R.id.awesomepager); 
awesomePager.setAdapter(awesomeAdapter); 
awesomePager.setCurrentItem(CurrentPosition); 

und es kann ich durch die Berechnung der Höhe der Elemente beschränkt sein wollen, um es fit in

+4

Beachten Sie, dass, wenn 'awesomeAdapter' durch einen Cursor/LoaderManager unterstützt wird, Sie vorsichtig sein müssen, wenn' setCurrentItem' aufgerufen wird, um zu vermeiden, den Fokus zu stehlen (zu spät) oder die Seite überhaupt nicht zu verschieben (zu früh) - see [this] (http://stackoverflow.com/a/24174114/404960) – rymo

+0

funktionierte nicht für mich, weil meine anderen Fragmente zu diesem Zeitpunkt noch nicht fertig sind und ich eine Ausnahme habe, da meine App versucht hat, eine zu verwenden Variable aus dem 'currentPosition'-Fragment, das noch nicht erstellt wurde – Zvi

+0

Working Perfect. Das Einstellen des Pagers, wenn das Fragment fertig ist, funktioniert einwandfrei. Dies wurde versucht, wenn das Fragment fertig und die aktuelle Position verfügbar ist. Danke @Kirill –

7

ich auf ein Problem kam, wobei, wenn ich das aktuelle Element festlegen, bevor ich den Adapter festgelegt, wobei der erste Artikel, den ich zurückbekommen wird immer derjenige an Position 0.

sicher tun Sie Stellen sein:

awesomePager.setAdapter(awesomeAdapter); 
awesomePager.setCurrentItem(CurrentPosition); 

und nicht:

awesomePager.setCurrentItem(CurrentPosition); 
awesomePager.setAdapter(awesomeAdapter); 
11

Ich habe bemerkt, dass, wenn Sie Aktivität (Ausrichtung ändern) neu mit ViewPager FragmentStatePagerAdapter hat, dann wird der Adapter wieder verwenden es Fragmente. Die Art und Weise, es zu stoppen ist:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    if (viewPager != null) { 
     // before screen rotation it's better to detach pagerAdapter from the ViewPager, so 
     // pagerAdapter can remove all old fragments, so they're not reused after rotation. 
     viewPager.setAdapter(null); 
    } 
    super.onSaveInstanceState(savedInstanceState); 
} 

aber dann nach Aktivität Erholung ViewPager alwayes öffnet Seite 0 erste und setCurrentItem (Current); funktioniert nicht. Fix für das ändert Seite nach Verzögerung:

new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     viewPager.setCurrentItem(newPosition); 
    } 
}, 100); 
+0

Die Verzögerung ist in der Tat nach einem 'recreate() Aufruf 'erforderlich! :) – Annihil

1
@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    View currentPage = null; 
    switch(position){ 
     case 0: 
      currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)  
      break; 
     case 1: 
      currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)  
      ///////////// This page will be default //////////////////// 
      ((ViewPager)container).setCurrentItem(position); 
      //////////////////////////////////////////////////////////// 
      break; 
     case 2: 
      currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)  
      break; 
    return currentPage; 
} 
3

Ich verwende 3 Fragmente und auf meine app starten, die zweite (Mitte) Fragment wird standardmäßig angezeigt werden. Ich benutze nur die OnResume-Funktion und alles funktioniert super.

@Override 
protected void onResume() { 
    super.onResume(); 
    m_viewPager.setCurrentItem(1); 
} 
+0

Arbeitete für mich im Gegensatz zu einem Timer in OnCreate verwenden. Vielen Dank! – Gmeister4

+0

funktionierte nicht für mich, weil mein zweites Fragment zu diesem Zeitpunkt noch nicht fertig ist und ich eine Ausnahme habe, da meine App versuchte, eine Variable aus dem zweiten Fragment zu verwenden, die noch nicht erstellt wurde – Zvi

+0

So wie Sie eine Variable verwenden könnten sogar erstellt?! – Leebeedev

7

mit dem letzten Fragmente starten ich dies tat:

PagerAdapter pagerAdapter = new PagerAdapter(); 
viewPager.setAdapter(pagerAdapter); 
viewPager.setCurrentItem(pagerAdapter.getCount() - 1); 
6

Ich habe eine Reihe von Größe mehr als 1000 und ich in dymanic viewpager war mit Blick auf leftswipe auf Firstload stecken. Der folgende Code löste dies und führte zu einem glatten Scrollen:

@Override 
onResume(){ 
    super.onResume(); 
    viewPager.setCurrentItem(newPosition); 
} 
0

Ich stieß auf dasselbe Problem. Wenn ich ViewPager initialisiere, ist die Indikatorposition 0. Dies kann von der Berechnungsmenge für den Pager-Inhalt abhängen. Ich benutze ViewTreeObserver wie unten.

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     mViewPager.setCurrentItem(newPosition); 
     removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener); 
    } 
}; 
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener); 

und

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) { 
     if (observer == null) return; 
     if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { 
       observer.removeGlobalOnLayoutListener(listener); 
     } else { 
       observer.removeOnGlobalLayoutListener(listener); 
     } 
} 

Auf diese Weise auch nie mit der Zeit Einstellung der Verzögerung zu stören.

Verwandte Themen