¿Cómo cambiar la página de ViewPager?

Estoy usando ViewPager en mi aplicación y lo defino en la actividad principal. En el método onCreate , cargo un número determinado de páginas de SharedPreferences y luego las paso a PagerAdapter:

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

El problema es que si cambiara este número en Preferencias (u otra Actividad) a otro índice de página menos que vi antes, mi aplicación se bloquea 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?

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 de ViewPager .

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

Sin consultar tu código, creo que lo que estás describiendo es que tus páginas no están sincronizadas y que tienes datos obsoletos.

Usted dice que está cambiando el número de páginas y luego se bloquea porque está accediendo al conjunto de páginas anterior. Esto me parece que no llama a 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 a notifyDataSetChanged() , lo que encontrará es que ahora está viendo la página 3 del nuevo conjunto. Si anteriormente estaba viendo la página 8 del conjunto anterior, luego de notifyDataSetChanged() el nuevo conjunto y llamar a notifyDataSetChanged() , verá que ahora está viendo la última página del nuevo conjunto sin fallar.

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

deslizar hacia la derecha

viewPager.arrowScroll (View.FOCUS_RIGHT);

deslizar hacia la izquierda

viewPager.arrowScroll (View.FOCUS_LEFT);

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

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

Respuesta suplementaria

Al principio tenía problemas para obtener una referencia a ViewPager de otros métodos de clase porque addOnTabSelectedListener una clase interna anónima, lo que a su vez requería que la variable ViewPager se declarase 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); } }