2012-02-13 11 views
5

Tutto ciò che voglio fare è un carosello orizzontale in Android.Come creare il carosello ViewPager?

Se ho 3 schermi AB e C quindi voglio che il mio ViewPager per permettere a me di muoversi come A < -> B, B < -> C, C < -> A.

GTalk per La conversazione di Android può essere cambiata in questo modo. La schermata Home e la schermata dell'applicazione Samsung possono essere cambiate in questo modo.

A B e C sono frammenti e sto utilizzando un adattatore che estende FragmentPagerAdapter. Tutti i frammenti conterranno una webview.

Ho guardato herehere e qui ma nessuno di loro sembra fare quello che voglio.

Qualcuno può guidarmi nella giusta direzione?

+0

È possibile controllare [questo tutorial] (http://thedeveloperworldisyours.com/android/carousel-viewpager/#sthash.rtkOS5m2.J9bGU21I .dpbs) e questo [esempio in GitHub] (https://github.com/thedeveloperworldisyours/CarouselViewPager) – Cabezas

risposta

0

Implementare il getItem(int position) in questo modo:

public Fragment getItem(int position) 
{ 
    switch(position) 
    { 
     case 0: 
     Fragment A = new A(); 
     return A; 
     case 1: 
     Fragment B = new B(); 
     return B; 
     same for C.... 
    } 
} 

si può anche avere uno sguardo a qui: SimpleViewPager .. scaricare il codice sorgente e capire. Spero che sia d'aiuto.

+0

So come creare un ViewPager. Voglio sapere come farlo loop. Come lo schermo da a b b a c c a un dorso di nuovo. – Enigma

+0

Scusa, pensavo che tu mi chiedessi di viewpager. – Farhan

3

(cross-posting my answer da una domanda StackOverflow identico)

Una possibilità è la creazione di schermi in questo modo:

C 'ABCA'

C' sembra proprio come C, ma quando scorri fino a lì, ti fa passare al vero C. A 'sembra proprio come A, ma quando scorri fino a lì, ti passa al vero A.

Lo farei implementando onPageScrollStateChanged in questo modo:

@Override 
public void onPageScrollStateChanged (int state) { 
    if (state == ViewPager.SCROLL_STATE_IDLE) { 
     int curr = viewPager.getCurrentItem(); 
     int lastReal = viewPager.getAdapter().getCount() - 2; 
     if (curr == 0) { 
      viewPager.setCurrentItem(lastReal, false); 
     } else if (curr > lastReal) { 
      viewPager.setCurrentItem(1, false); 
     } 
    } 
} 

Si noti che questo chiama la forma alternativa di setCurrentItem e passa false a causare il salto per accadere immediatamente, piuttosto che come una pergamena liscia.

Ci sono due principali inconvenienti che vedo a questo. In primo luogo, al raggiungimento di entrambe le estremità l'utente deve lasciare che lo scrolling si stabilizzi prima di poter andare oltre. In secondo luogo, significa avere una seconda copia di tutte le visualizzazioni nella prima e nell'ultima pagina. A seconda di quanto siano pesanti le risorse degli schermi, ciò potrebbe escludere questa tecnica come possibile soluzione.

Si noti inoltre che poiché il pager della vista non consente ai clic di passare ai controlli sottostanti fino a quando lo scorrimento non si è risolto, è probabile che non sia impostato alcun clicklistener e simili per i frammenti A 'e C'.

Modifica: Avendo ora implementato questo da solo, c'è un altro svantaggio piuttosto importante. Quando passa da A 'a A o C' a C, lo sfarfallio dello schermo per un momento, almeno sul mio attuale dispositivo di test.

+0

Ho già provato questo. Ci sono altri problemi aggiuntivi. Se qualche vista è cambiata in A, allora anche A' dovrebbe riflettere lo stesso. Come se avessi fatto scorrere A e poi se andassi in A' ti mostrerà lo schermo senza crollare per un secondo e provocherà di nuovo lo sfarfallio. – Enigma

1

impostazioni ViewPager:

mViewPager = (ViewPager) findViewById(R.id.view_pager); 
    mViewPager.setAdapter(new YourPagerAdapter(getSupportFragmentManager())); 
    //Set the number of pages that should be retained to either side of the current page. 
    mViewPager.setOffscreenPageLimit(1); 
    mViewPager.setCurrentItem(50); 

FragmentPagerAdapter:

public class YourPagerAdapter extends FragmentPagerAdapter { 
    final int PAGE_COUNT = 100; 
    final int REAL_PAGE_COUNT = 3; 

    public YourPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     while (position > REAL_PAGE_COUNT - 1) { 
      position = position - REAL_PAGE_COUNT ; 
     } 

     switch (position) { 
      case 0: 
       return FirstFragment.newInstance(position); 
      case 1: 
       return SecondFragment.newInstance(position); 
      case 2: 
       return ThirdFragment.newInstance(position); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return PAGE_COUNT; 
    } 
} 
Problemi correlati