fragments - view pager adapter android studio
¿Cómo cambiar la página de ViewPager? (5)
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 pila de logcat para ser más específico si este no es el problema.
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?
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);
}
}