Android ViewPager setCurrentItem no funciona después de onResume




6 Answers

Tuve un problema similar en OnCreate of my Activity. El adaptador se configuró con el recuento correcto y apliqué setCurrentItem después de configurar el adaptador en ViewPager; sin embargo, devolvería el índice fuera de límites. Creo que ViewPager no había cargado todos mis Fragmentos en el momento en que establecí el elemento actual. Al publicar un ejecutable en ViewPager, pude solucionar esto. Aquí hay un ejemplo con un poco de contexto.

    // Locate the viewpager in activity_main.xml
    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);

    // Set the ViewPagerAdapter into ViewPager
    viewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));

    viewPager.setOffscreenPageLimit(2);

    viewPager.post(new Runnable() {
        @Override
        public void run() {
            viewPager.setCurrentItem(ViewPagerAdapter.CENTER_PAGE);
        }
    });
android methods android-viewpager onresume

Tengo este extraño problema, el SetCurrentItem de ViewPager (position, false) funciona perfectamente bien, luego estoy cambiando a otra actividad, y luego de volver a la primera actividad, el ViewPager siempre termina en el primer elemento. Aunque he agregado setCurrentItem al método onResume, todavía lo ignora. No está lanzando ninguna excepción cuando intento establecer el ítem fuera del índice de límites. Aunque más adelante cuando llamo a este método, cuando se hace clic en el botón "siguiente", funciona como se esperaba. Comprobé mi código 10 veces para cualquier posible llamada a setCurrentItem (0) o smth, pero simplemente no está allí en absoluto.




Tengo el mismo problema y edito

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

Establecí NUM_PAGES un error de solo 1.




Para mí, esto funcionó estableciendo el elemento actual después de configurar el adaptador

viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));

viewPager.setCurrentItem(idx);

pagerSlidingTabStrip.setViewPager(viewPager);// assign viewpager to tabs



Lo hice de esta manera para restaurar el elemento actual:

@Override
protected void onSaveInstanceState(Bundle outState) {

    if (mViewPager != null) {
        outState.putInt(STATE_PAGE_NO, mViewPager.getCurrentItem());
    }

    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {

    if (savedInstanceState != null) {
        mCurrentPage = savedInstanceState.getInt(STATE_PAGE_NO, 0);
    }

    super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onRestart() {
    mViewPager.setCurrentItem(mCurrentPage);
         super.onRestart();
}



En el momento en que llamo a setCurrentItem() la vista está a punto de ser recreada. De hecho, invoco setCurrentItem() para el viewpager y luego el sistema llama onCreateView() y crea un nuevo viewpager.

Esta es la razón por la que no veo ningún cambio. Y esta es la razón por la que un postDelayed() puede ayudar.

Solución teórica: setCurrentItem() invocación setCurrentItem() hasta que la vista haya sido recreada.

Solución práctica: no tengo idea de una solución estable y simple. Deberíamos poder verificar si la clase está a punto de recrear su vista y si ese es el caso posponer la invocación de setCurrentItem() al final de onCreateView()




LIMPIO Y SIMPLE No es necesario agregar el método de publicación simplemente setCurrentItem después de llamar notifyDataSetChanged ().




Related