2012-08-09 13 views
50

Używam następujący przykład impliment mój viewPager: http://code.google.com/p/viewpagerexample/issues/listPagerAdapter pozycja startowa

Problem z tym przykładzie jest to, że nie mogę dowiedzieć się, jak ustawić moją pozycję startową, domyślną pozycja początkowa wynosi 0 Zasadniczo nie będę w stanie kontrolować, czy jest dostępny widok po jego lewej lub prawej stronie.

Czy jest jakikolwiek sposób na sterowanie centrum? Wyświetl aktualną pozycję? czy jest lepszy sposób na zrobienie tego? czy możliwe jest, aby był okrągły?

Odpowiedz

121

Znalazłem sposób ustawić to pozycja, która odbywa się poza klasą:

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

i może być ograniczony przez obliczenie ilości przedmiotów Chcę się zmieścić w niej

+4

Zwróć uwagę, że jeśli 'awesomeAdapter' jest wspierany przez Cursor/LoaderManager, musisz uważać, kiedy' setCurrentItem' jest wywoływany, aby uniknąć kradzieży fokusa (zbyt późno) lub w ogóle nie przesuwać strony (zbyt wcześnie) - zobacz [this] (http://stackoverflow.com/a/24174114/404960) – rymo

+0

nie działa dla mnie, ponieważ moje inne fragmenty nie są gotowe w tym momencie i mam wyjątek, ponieważ moja aplikacja próbowała użyć zmienna z fragmentu 'currentPosition', który nie został jeszcze utworzony – Zvi

+0

Działający idealnie. Ustawianie pager widoku, gdy fragment jest gotowy działa dobrze, wypróbowałem to, gdy fragment jest gotowy i masz dostępną bieżącą pozycję. Dzięki @Kirill –

7

natknąłem się na problem przy czym jeśli ja ustawić aktualną pozycję przed ustawić adapter, pierwszy element wrócę zawsze będzie jeden w pozycji 0.

Upewnij się zrobić:

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

a nie:

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

Zauważyłem, że jeśli ponownie aktywny (zmiana orientacji) z ViewPager mający FragmentStatePagerAdapter, adapter będzie ponowne jego fragmenty. Sposobem na to jest przystanek:

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

ale potem po alwayes aktywny rekreacji ViewPager otwiera stronę 0 pierwszy i setCurrentItem (CurrentPosition); nie działa. Fix za to zmienia stronę po opóźnieniem:

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

Opóźnienie jest rzeczywiście potrzebne po wywołaniu funkcji "recreate()"! :) – 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

Używam 3 fragmenty i rozpoczynając moją aplikację, The (środkowa) fragment sekund będą wyświetlane domyślnie. Po prostu używam funkcji onResume i wszystko działa świetnie.

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

Pracowałem dla mnie w przeciwieństwie do używania timera w onCreate. Dzięki! – Gmeister4

+0

nie działa dla mnie, ponieważ mój drugi fragment nie jest gotowy w tym momencie i mam wyjątek, ponieważ moja aplikacja próbowała użyć zmiennej z drugiego fragmentu, który nie został jeszcze utworzony. – Zvi

+0

Jak można użyć zmiennej, która nie nawet stworzony?! – Leebeedev

7

Na początek ostatniego fragmentu Zrobiłem to:

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

Mam tablicę o wielkości większej niż 1000 i dynamiczny viewpager byłem stoi leftswipe naklejane na firstload. Poniższy kod rozwiązał to i spowodował płynne przewijanie:

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

Napotkałem ten sam problem. Po zainicjowaniu ViewPagera pozycja wskaźnika wynosiła 0. Może to zależeć od ilości obliczeń dla zawartości pagera. Używam ViewTreeObserver jak poniżej.

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

i

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

W ten sposób, nigdy też zajmować się ustawienie czasu opóźnienia.

Powiązane problemy