0

Je développe une application Android où j'ai un ViewPager dans mon MainActivity, composé de 3 fragments. Le problème est le suivant, quand je glisse vers le 3ème fragment, et que je reviens au 1er, onCreateView du fragment 1 est appelé ce qui est ce que je veux vraiment, cependant, Si je suis passé au 2ème fragment seulement, le 1er, onCreateView n'est pas appelé! J'ai besoin de trouver une solution à ce problème, j'ai passé des heures à essayer de trouver une solution mais je n'ai pas su la résoudre. est ici le code lié à la ViewPager dans mon MainActivityFragment sur CreateView n'est pas appelé lors de l'utilisation ViewPager

private void setupViewPager(final ViewPager viewPager) { 
    final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFrag(new voting(), "ONE"); 
    adapter.addFrag(new dashboard(), "TWO"); 
    adapter.addFrag(new chats(), "THREE"); 
    myAdapter=adapter; 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(0); 
} 

private class ViewPagerAdapter extends FragmentStatePagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<Fragment>(); 
    private final List<String> mFragmentTitleList = new ArrayList<String>(); 

    private ViewPagerAdapter(FragmentManager manager) { 
     super(manager); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Log.i("getItem","getItem"); 
     return mFragmentList.get(position); 
    } 


    @Override 
    public int getCount() { 
     return mFragmentList.size(); 
    } 

    private void addFrag(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

    //added newly 
    @Override 
    public int getItemPosition(Object object){ 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return null; 
    } 
} 
+0

"Si je n'ai migré que vers le 2ème fragment et que je suis revenu au 1er, onCreateView n'est pas appelé" - si vous voulez dire que "onCreateView()" n'est pas appelé sur le premier fragment, c'est normal. "J'ai besoin de trouver une solution à ce problème" - pourquoi penses-tu que c'est un problème? – CommonsWare

+0

@CommonsWare Oui, c'est ce que je veux dire, mais je n'ai pas encore trouvé de solution. –

Répondre

1

Ce comportement est destiné à un FragmentPagerAdapter. Si le fragment a déjà été créé et est toujours en mémoire, il est simplement rattaché au ViewPager. Par conséquent, la raison pour laquelle onCreateView(...) n'est pas appelée une deuxième fois.

Implémentation de PagerAdapter qui représente chaque page comme un fragment conservé de façon persistante dans le gestionnaire de fragments tant que l'utilisateur peut revenir à la page.

Vous utilisez un FragmentStatePagerAdapter qui est une sous-classe de FragmentPagerAdapter, il hérite de ce comportement.

Généralement, ce n'est pas une bonne idée de recréer une vue à chaque changement de page, car cela coûte cher et peut conduire à un défilement irrégulier. Si vous aviez une logique dans onCreateView(...) que vous souhaitez réexécuter à chaque changement de fragment, alors je suggère de regarder ViewPager.OnPageChangedListener.

+0

Et si ma logique est en quelque sorte liée à l'inflateur dans onCreateView et ViewGroup et ce genre de choses? comment puis-je exécuter cette logique à partir de mainActivity? –

+1

Utilisez l'inflateur pour créer des vues et conservez des références à ces vues dans le fragment pour interagir avec elles plus tard. Vous ne devriez pas avoir besoin d'un inflater après 'onCreateView (...)' sauf si vous créez dynamiquement des vues pour une raison quelconque. Mettez à jour votre question avec votre cas d'utilisation de gonfleur et peut-être nous pouvons suggérer un meilleur modèle :) – Jon