El fragmento en ViewPager usando FragmentPagerAdapter está en blanco la segunda vez que se ve


Tengo una interfaz de fragmentos con pestañas a lo largo de la parte inferior que abren diferentes fragmentos en la vista principal.

Tengo un fragmento en particular que es una lista de elementos. Si el usuario selecciona uno de los elementos de esta lista, se abre otro fragmento que contiene un viewpager que se desplaza horizontalmente entre todos los elementos de la lista del fragmento anterior. Esto funciona muy bien.

El viewpager utiliza un FragmentPagerAdapter para mostrar los elementos.

El problema viene cuando el usuario selecciona un elemento de la lista, lo ve, luego presiona el botón en la barra de pestañas para volver a la lista y luego selecciona otro elemento. La segunda vez que se selecciona un elemento, aparece una pantalla en blanco en lugar del viewpager. No recibo errores en mi LogCat cuando esto sucede.

¿Por qué el viewpager solo aparece la primera vez?

FragmentPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    Cursor mCursor;

    public ViewPagerAdapter(FragmentManager fm, Cursor c) {
        super(fm);
        mCursor = c;
    }

    public void changeCursor(Cursor c) {
        mCursor = c;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        if (mCursor == null) return 0;
        else return mCursor.getCount();
    }

    @Override
    public Fragment getItem(int position) {
        mCursor.moveToPosition(position);
        return TeamCardFragment.newInstance(mCursor, position);
    }
}

PagerFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);

    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();

    return mView;
}

private class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mViewPager.setAdapter(mAdapter);
        mViewPager.setCurrentItem(mCursorPosition);
    }
}
Author: blahdiblah, 2011-10-13

11 answers

Tuve el mismo problema. Cambiar la clase padre de mi PageAdapter de android.support.v4.app.FragmentPagerAdapter a android.support.v4.app.FragmentStatePagerAdapter resolver mi problema de visualización ViewPager en "segunda vez"!

 202
Author: Yann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-19 07:00:52

Logré resolver esto reemplazando getFragmentManager() con getChildFragmentManager() en el fragmento padre. Este fragmento padre instanciaba un android.apoyo.v4.app.FragmentPagerAdapter para contener fragmentos pageables (deslizables), lo que requiere un administrador de fragmentos en el constructor. A este constructor le pasé el valor devuelto de getChildFragmentManager().

El enlace de Hackbod fue clave ( https://developer.android.com/about/versions/android-4.2.html#NestedFragments ), que se encontró en este post Fragmentos dentro de fragmentos

 72
Author: Daniel F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-16 10:13:58

Para mí tuve que llamar a esto en mi viewpager:

myViewPager.setSaveFromParentEnabled(false);

Tuve el problema de que el viewpager no se actualizaba y todo lo que vi fue una pantalla blanca en blanco donde deberían estar los fragmentos. Estaba pasando en getChildFragmentManager pero no ayudó.

 12
Author: j2emanue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-20 03:19:05

En mi caso muy particular, donde estaba usando un CoordinatorLayout con un AppBarLayout y el ViewPager, lo que lo resolvió para mí fue eliminar android:fitsSystemWindows="true" de mis propiedades xml de AppBarLayout.

No me preguntes por qué. Sé que suena un poco ridículo y como que no debería tener correlación, pero fue esta sola línea la única cosa que estaba causando problemas ya que ya estaba usando getChildFragmentManager() en mi adaptador. Pasé todo un día de depuración de mi código solo para encontrar esto, así que espero que ahorra a alguien más algún tiempo.
 8
Author: emirua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 00:36:46

Tuve el mismo problema por el que cambié el adaptador de FragmentPagerAdapter a FragmentStatePagerAdapter y getFragmentManager() en el fragmento padre a getChildFragmentManager()

La razón detrás de esto es que FragmentStatePagerAdapter es útil para almacenar un gran número de páginas y la memoria asociada con cada página visitada es menor, ya que mantiene solo el estado guardado del fragmento mientras la página no es visible. Esto reduce la sobrecarga mientras se cambia entre los fragmentos.

 7
Author: Yashaswi N P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 07:18:18

Logramos evitar esto re-implementando los elementos del paginador de vista como vistas estándar en lugar de fragmentos y cambiando el adaptador en consecuencia.

 2
Author: howettl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 19:24:38

Esto te ayudaría.

    viewPager.setOffscreenPageLimit(position);
 2
Author: Pardeep Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-21 07:27:27

También puede inicializar el adaptador para los casos en los que experimente este error cuando su aplicación se minimice y luego se llame.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
    initViewPagerAdapter();
    return mView;
}
private void initViewPagerAdapter(){
    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();
}

@Override
public void onResume(){
    super.onResume();
    initViewPagerAdapter();
}
 0
Author: Patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-24 16:38:16

Tuve la misma cosa, en la segunda vez que llamo al Adaptador de Paginador, la vista hija devuelve una NullPointerException. Y cambiar el adaptador en FragmentStatePagerAdapter resolver mi problema también.

 0
Author: Arka-57,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-04 02:00:28

Estaba recibiendo este mismo problema en Xamarin Android con una pantalla en blanco la segunda vez.. Establecer lo siguiente lo arregló para mí.

viewPager.SaveFromParentEnabled = false;
 0
Author: Gerard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-24 07:18:43

Intenta poner setOffscreenPageLimit (int limit) on parent ViewPager.

mViewPager.setOffscreenPageLimit(totalPages-1);

Esto funcionó para mí como encanto.

En mi caso tenía fragmento dentro TabLayout con ViewPager.

Y otro ViewPager dentro de ese fragmento. La primera vez todo funciona bien, pero cuando cambio de pestaña y regreso, parte de mi fragmento se ha quedado en blanco.

 0
Author: Rumit Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 07:00:00