Comportement étrange FragmentPagerAdapter

J'ai donc le problème suivant avec FragmentPagerAdapter. J'ai un TabLayout avec 3 onglets représentant 3 fragments que je peux basculer. Donc, quand je passe au troisième fragment, pour une raison quelconque, le premier disparaît (ou sa vue). Est-ce que quelqu'un sait comment résoudre ce problème? Merci d'avance.

public class SectionsPagerAdapter extends FragmentPagerAdapter {

private static final int FRAGMENT_COUNT = 3;

private final List listOfFragments = new ArrayList<>();

public SectionsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position);
}

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

public void addFragment(Fragment fragment) {
    listOfFragments.add(fragment);
}


}

Ceci est le code pour FragmentPagerAdapter.

1
Et je pense avoir résolu ce problème :) La seule chose que j’ai fait est de remplacer la méthode FragmentPagerAdapter destroyItem() par un corps vide (pas de super.)
ajouté l'auteur RadoVidjen, source
Et je pense avoir résolu ce problème :) La seule chose que j’ai fait est de remplacer la méthode FragmentPagerAdapter destroyItem() par un corps vide (pas de super.)
ajouté l'auteur RadoVidjen, source
pouvez-vous s'il vous plaît montrer le code où vous liez votre adaptateur?
ajouté l'auteur Rutvik Bhatt, source

8 Réponses

Et je pense avoir résolu ce problème :) La seule chose que j’ai fait est de remplacer la méthode FragmentPagerAdapter destroyItem() par un corps vide (pas de super).

0
ajouté

Et je pense avoir résolu ce problème :) La seule chose que j’ai fait est de remplacer la méthode FragmentPagerAdapter destroyItem() par un corps vide (pas de super).

0
ajouté

L'un des problèmes ici est une API légèrement déroutante.

Dans FragmentPagerAdapter , getItem (position int) signifie en réalité "créer un élément". En d'autres termes, vous ne devriez pas essayer de mettre en cache manuellement les fragments dans une liste de votre adaptateur.

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

Même si cela peut sembler contre-intuitif, vous devriez créer une nouvelle instance du fragment que vous voulez dans getItem , en restant très proche de l'exemple officiel de Google:

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

Otherwise you will run into problems where the FragmentManager's cache and your own List cache are out-of-sync. In short, caching of Fragments is handled by the FragmentManager and you don't need to roll-your-own caching.

0
ajouté

L'un des problèmes ici est une API légèrement déroutante.

Dans FragmentPagerAdapter , getItem (position int) signifie en réalité "créer un élément". En d'autres termes, vous ne devriez pas essayer de mettre en cache manuellement les fragments dans une liste de votre adaptateur.

@Override
public Fragment getItem(int position) {
    return listOfFragments.get(position); //No! don't do this
}

Même si cela peut sembler contre-intuitif, vous devriez créer une nouvelle instance du fragment que vous voulez dans getItem , en restant très proche de l'exemple officiel de Google:

@Override 
public Fragment getItem(int position) {
    switch (position) {
        case 0: 
            return FirstFragment.getInstance();
        case 1:
            return SecondFragment.getInstance(); 
    }
}

Otherwise you will run into problems where the FragmentManager's cache and your own List cache are out-of-sync. In short, caching of Fragments is handled by the FragmentManager and you don't need to roll-your-own caching.

0
ajouté

I don't know what is your problem. but if in your app only 3 fragments are there than you can try setOffscreenPageLimit method of ViewPager

ViewPager.setOffscreenPageLimit(3);
0
ajouté
Merci pour le commentaire! Le problème est que, pour une raison quelconque, si vous avez trois fragments et disons que vous définissez setCurrentItem (1) (ce qui signifie que le deuxième fragment est la valeur par défaut), puis passez au dernier fragment (troisième), puis revenez au premier fragment. pas de premier fragment, on dirait qu'il a été retiré pour une raison quelconque (ou du moins sa mise en page). Comme je l'ai mentionné dans mon commentaire, je l'ai corrigé en surchargeant destroyItem() de FragmentPagerAdapter.
ajouté l'auteur RadoVidjen, source
D'accord! Super. et postez votre solution comme réponse, donc si une autre personne visite cette question, votre réponse les aidera à résoudre son problème.
ajouté l'auteur Bhavesh Rangani, source

I don't know what is your problem. but if in your app only 3 fragments are there than you can try setOffscreenPageLimit method of ViewPager

ViewPager.setOffscreenPageLimit(3);
0
ajouté
Merci pour le commentaire! Le problème est que, pour une raison quelconque, si vous avez trois fragments et disons que vous définissez setCurrentItem (1) (ce qui signifie que le deuxième fragment est la valeur par défaut), puis passez au dernier fragment (troisième), puis revenez au premier fragment. pas de premier fragment, on dirait qu'il a été retiré pour une raison quelconque (ou du moins sa mise en page). Comme je l'ai mentionné dans mon commentaire, je l'ai corrigé en surchargeant destroyItem() de FragmentPagerAdapter.
ajouté l'auteur RadoVidjen, source
D'accord! Super. et postez votre solution comme réponse, donc si une autre personne visite cette question, votre réponse les aidera à résoudre son problème.
ajouté l'auteur Bhavesh Rangani, source

Je ne sais pas vraiment ce qui se passe mais c'est mon code, j'espère que cela vous aidera

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

et voici mon Tablayout:

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);
0
ajouté

Je ne sais pas vraiment ce qui se passe mais c'est mon code, j'espère que cela vous aidera

public class AdapterFragmentViewPager extends FragmentPagerAdapter {

    private List fragmentList = new ArrayList<>();


    public AdapterFragmentViewPager(FragmentManager fm) {
        super(fm);
    }

    public void addFragment(Fragment fragment) {
        fragmentList.add(fragment);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

et voici mon Tablayout:

private AdapterFragmentViewPager adapterFragmentViewPager = new AdapterFragmentViewPager(getSupportFragmentManager());
TabLayout.Tab home = tabLayout.newTab();
        tabLayout.addTab(home);

        TabLayout.Tab newest = tabLayout.newTab();
        tabLayout.addTab(newest);

        TabLayout.Tab author = tabLayout.newTab();
        tabLayout.addTab(author);

        TabLayout.Tab category = tabLayout.newTab();
        tabLayout.addTab(category);

        TabLayout.Tab saved = tabLayout.newTab();
        tabLayout.addTab(saved);


        adapterFragmentViewPager.addFragment(FragmentHome.newInstance());
        adapterFragmentViewPager.addFragment(FragmentQuote.newInstance());
        adapterFragmentViewPager.addFragment(FragmentAuthor.newInstance());
        adapterFragmentViewPager.addFragment(FragmentCategory.newInstance());
        adapterFragmentViewPager.addFragment(FragmentFavorites.newInstance());
        viewPager.setAdapter(adapterFragmentViewPager);
        tabLayout.setupWithViewPager(viewPager);
0
ajouté