J'essaye d'obtenir la référence à un fragment spécifique appelé MyChatsFragment
après l'instanciant avec un SectionPageAdapter
fait sur commande.Comment obtenir la référence de fragment de ViewPager
D'abord, je suis d'ajouter les fragments
mSectionsPageAdapter.addFragment(new CatalogFragment());
mSectionsPageAdapter.addFragment(new MyBooksfragment());
mSectionsPageAdapter.addFragment(new MyChatsFragment());
viewPager.setAdapter(mSectionsPageAdapter);
Je suis en train de récupérer MyChatsFragment
cette façon:
MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter
.getRegisteredFragment(2);
Pourtant, getRegisteredFragment(2)
retours null
et pendant le débogage, je l'ai remarqué ce qui suit:
Dans l'adaptateur, instantiateItem
n'est appelé que deux fois, ce qui ajoute CatalogFragment
d MyBooksFragment
à registeredFragments
SparseArray. Cela expliquerait pourquoi getRegisteredFragment(2)
renvoie null
. Mais pourquoi MyChatsFragment
est réellement créé et l'application est parfaitement fonctionnelle si instantiateItem
n'est même pas appelé pour cela?
Pourquoi MyChatsFragment
n'est pas ajouté à registeredFragments
SparseArray alors que d'autres fragments le sont?
Est-ce que getItem(position)
est une solution viable?
Après avoir vérifié this answer, je l'ai adapté mon SectionsPageAdapter
en remplaçant instantiateItem
et destroyItem
que vous serez en mesure de vérifier le code ci-dessous:
public class SectionsPageAdapter extends FragmentPagerAdapter{
private final List<Fragment> mFragmentList = new ArrayList<>();
private final SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();
public void addFragment(Fragment fragment)
{
mFragmentList.add(fragment);
}
public SectionsPageAdapter(FragmentManager FM)
{
super(FM);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
registeredFragments.put(position, fragment);
return fragment;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
registeredFragments.remove(position);
super.destroyItem(container, position, object);
}
public Fragment getRegisteredFragment(int position) {
return registeredFragments.get(position);
}
}
Note: Si nécessaire, je peux partager le code MyChatsFragment
.
Comme je l'ai demandé dans mon article, veuillez fournir une brève explication concernant la méthode 'getItem'. –
Comme vous avez écrit 'addFragment()' ajoute un fragment à 'mFragmentList' et vous ajoutez un fragment par cette méthode en appelant' mSectionsPageAdapter.addFragment (new MyChatsFragment()) '. et 'getItem()' retourne un fragment de 'mFragmentList' où vous avez ajouté votre fragment. Donc, si vous voulez obtenir la référence 'MyChatsFragment', utilisez simplement MyChatsFragment myChatsFragment = (MyChatsFragment) mSectionsPageAdapter .getItem (2);' ou 'MyChatsFragment myChatsFragment = (MyChatsFragment) viewPager.getAdapter.getItem (2);' –