2012-02-13 27 views
5

Todo lo que quiero hacer es un carrusel horizontal en Android.Cómo crear carrusel ViewPager?

Si tengo 3 pantallas AB y C entonces yo quiero que mi ViewPager para permitir que me mueva como Un < -> B, B < -> C, C < -> A.

GTalk para La conversación de Android se puede cambiar así. La pantalla de inicio y la pantalla de aplicaciones de Samsung se pueden cambiar así.

A B y C son fragmentos y estoy usando un adaptador que amplía FragmentPagerAdapter. Todos los fragmentos contendrán una vista web.

He buscado herehere y aquí, pero ninguno de ellos parece estar haciendo lo que quiero.

¿Alguien puede guiarme en la dirección correcta?

+0

Usted puede comprobar [tutorial] (http://thedeveloperworldisyours.com/android/carousel-viewpager/#sthash.rtkOS5m2.J9bGU21I .dpbs) y este [ejemplo en GitHub] (https://github.com/thedeveloperworldisyours/CarouselViewPager) – Cabezas

Respuesta

0

Poner en práctica el getItem(int position) así:

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.... 
    } 
} 

Usted también puede tener un vistazo a aquí: SimpleViewPager .. descargar el código fuente y entenderlo. Espero eso ayude.

+0

Sé cómo crear un ViewPager. Quiero saber cómo hacerlo circular. Me gusta la pantalla a a b b a c c a la espalda de nuevo. – Enigma

+0

Lo siento, pensé que preguntabas por viewpager. – Farhan

3

(publicación cruzada my answer a partir de una pregunta StackOverflow idéntica)

Una posibilidad es la creación de las pantallas de la siguiente manera:

C 'ABCA'

C' se parece a C, pero cuando se desplaza hasta allí, lo cambia a la real C. A 'se parece a A, pero cuando se desplaza hasta allí, lo cambia al real A.

Haría esto implementando onPageScrollStateChanged 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); 
     } 
    } 
} 

Tenga en cuenta que esto requiere la forma alternativa de setCurrentItem y pasa false para causar el salto a suceder al instante y no como un desplazamiento suave.

Hay dos inconvenientes principales que veo en esto. En primer lugar, al llegar a cualquiera de los extremos, el usuario tiene que dejar que el desplazamiento se asiente antes de que pueda avanzar. En segundo lugar, significa tener una segunda copia de todas las vistas en su primera y última página. Dependiendo de la carga de recursos de sus pantallas, puede descartar esta técnica como una posible solución.

Tenga en cuenta también que dado que el buscapersonas no permite que los clics pasen a los controles subyacentes hasta que se haya establecido el desplazamiento, es probable que no configure clicklisteners y similares para los fragmentos A 'y C'.

Editar: Ahora que lo he implementado, hay otro inconveniente bastante importante. Cuando cambia de A 'a A o C' a C, la pantalla parpadea por un momento, al menos en mi dispositivo de prueba actual.

+0

Ya lo he intentado. Hay otros problemas adicionales. Si alguna vista ha cambiado en A, entonces A' también debería reflejar lo mismo. Al igual que si te has desplazado en A y luego, si vas a A', te mostrará la pantalla sin deslizar por un segundo y volverá a parpadear. – Enigma

1

configuración 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; 
    } 
}