2011-09-15 56 views
132

Estoy usando ViewPager en mi aplicación y lo defino en la Actividad principal. Dentro onCreate método me carga un número determinado de páginas de SharedPreferences y luego pasarlo a PagerAdapter:¿Cómo cambiar la página de ViewPager?

@Override 
public int getCount() { 
    return numberOfPages; 
} 

El problema es que si me iba a cambiar este número en Preferencias (u otra actividad) a algún otro menos índice de la página I visto antes, mi aplicación se cuelga porque este índice está fuera de límites cuando regrese a la actividad con este ViewPager. Se puede arreglar simplemente cambiando la página activa de ViewPager. ¿Hay alguna forma de hacerlo?

Respuesta

345

No estoy seguro de entender completamente la pregunta, pero por el título de su pregunta, supongo que lo que está buscando es pager.setCurrentItem(num). Eso le permite cambiar programáticamente a otra página dentro del ViewPager.

Necesitaría ver un seguimiento de la pila de logcat para ser más específico si este no es el problema.

+2

Sí, eso es exactamente lo que necesito. Lo configuré en '0' en el método' onPause' y no hay bloqueos. Gracias. – Roman

+0

De hecho, hay muy poca documentación en ViewPager. +1 por eso. –

+1

si su localizador toma mucho tiempo para cargar la página de lo que puede usar setOffscreenPageLimit (1), porque de forma predeterminada ver el localizador cargar +1 y -1 página desde la posición actual –

14

Sin verificar su código, creo que lo que usted describe es que sus páginas no están sincronizadas y tiene datos obsoletos.

Dice que está cambiando el número de páginas, y luego se bloquea debido a que está accediendo al conjunto anterior de páginas. Me parece que no está llamando al pageAdapter.notifyDataSetChanged() después de cambiar sus datos.

Cuando su viewPager muestra la página 3 de un conjunto de 10 páginas, y cambia a un conjunto con solo 5, luego llame al notifyDataSetChanged(), lo que encontrará es que está viendo la página 3 del nuevo conjunto. Si anteriormente estaba viendo la página 8 del conjunto anterior, luego de ingresar el nuevo conjunto y llamar al notifyDataSetChanged(), verá que ahora está viendo la última página del nuevo conjunto sin bloquearse.

Si simplemente cambia su página actual, es posible que esté enmascarando el problema.

+0

más 1 para notifyDataSetChanged() –

9

para cambiar a otra página, tratar con este código:

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

¡Perfecto! Traté de usarlo sin el método postDelay y no funcionó. ¿Sabes por qué funciona con este método? ¡Gracias! :) –

2

respuesta Suplementario

que estaba teniendo un principio problemas para conseguir una referencia a la ViewPager de otros métodos de clase porque el addOnTabSelectedListener hizo una clase interna anónima, que a su vez requirió que la variable ViewPager fuera declarada final. La solución fue usar una variable miembro de clase y no usar la clase interna anónima.

public class MainActivity extends AppCompatActivity { 

    TabLayout tabLayout; 
    ViewPager viewPager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     tabLayout = (TabLayout) findViewById(R.id.tab_layout); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
     tabLayout.addTab(tabLayout.newTab().setText("Tab 3")); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount()); 
     viewPager.setAdapter(adapter); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

     // don't use an anonymous inner class here 
     tabLayout.addOnTabSelectedListener(tabListener); 

    } 

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() { 

     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      viewPager.setCurrentItem(tab.getPosition()); 
     } 

     @Override 
     public void onTabUnselected(TabLayout.Tab tab) { 

     } 

     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 

     } 
    }; 

    // The view pager can now be accessed here, too. 
    public void someMethod() { 
     viewPager.setCurrentItem(0); 
    } 

} 
8

diapositiva a derecha

viewPager.arrowScroll (View.FOCUS_RIGHT);

deslizante a la izquierda

viewPager.arrowScroll (View.FOCUS_LEFT);

+0

corto y limpio! – dakshbhatt21

Cuestiones relacionadas