Je ne suis pas en mesure de réutiliser le fragment dans FragmentPagerAdapter .. En utilisant la méthode destroyItem (), il supprime le fragment mais n'appelle toujours pas getItem () à nouveau .. Il n'y a que 2-3 images donc j'utilise FragmentPagerAdapter au lieu de FragmentStatePagerAdapter ..
public class ExamplePagerAdapter extends FragmentPagerAdapter {
ArrayList < String > urls;
int size = 0;
public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
super(fm);
urls = res;
size = urls.size();
}
@Override
public int getCount() {
if (urls == null) {
return 0;
} else {
return size;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new FloorPlanFragment();
Bundle b = new Bundle();
b.putInt("p", position);
b.putString("image", urls.get(position));
Log.i("image", "" + urls.get(position));
fragment.setArguments(b);
return fragment;
}
}
Et dans FragmentActivity,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
destroyItem()
? Ce n'est pas nécessaire.Réponses:
Réponse KISS:
Utilisez simplement FragmentStatePagerAdapter au lieu de FragmentPagerAdapter .
J'ai eu la réponse .. Tout d'abord, j'ai pensé supprimer cette question car je fais une erreur très idiote, mais cette réponse aidera quelqu'un qui est confronté au même problème qu'au lieu d'
FragmentPagerAdapter
utiliserFragmentStatePagerAdapter
.Comme @BlackHatSamurai l'a mentionné dans le commentaire:
la source
L'utilisation d'un
FragmentStatePagerAdapter
n'a pas complètement résolu mon problème qui était un problème similaire oùonCreateView
il n'y avait pas d'appel pour les fragments enfants dans le pager de vue. Je suis en fait en train de nicher monFragmentPagerAdapter
intérieur dans un autre,Fragment
donc le aFragmentManager
été partagé entre tous et donc en conservant des exemples des anciens fragments. Le correctif consistait à alimenter à la place une instance de thegetChildFragmentManager
au constructeur duFragmentPagerAdapter
fragment in my host. Quelque chose comme...La
getChildFragmentManager()
méthode est accessible via un fragment et cela a fonctionné pour moi car elle renvoie un privéFragmentManager
pour ce fragment spécifiquement pour les situations dans lesquelles l'imbrication de fragments est nécessaire. J'espère que cela aide quelqu'un qui peut avoir le même problème que moi !!getChildFragmentManager()
votre version minimale de l'API doit être au moins17 (4.2)
, cela peut donc vous gâcher. Bien sûr, si vous utilisez des fragments de la bibliothèque de support v4, vous devriez être d'accord.la source
Passer outre
long getItemId (int position)
FragmentPagerAdapter
met en cache les fragments qu'il crée à l'aide degetItem
. J'étais confronté au même problème - même après avoir appelénotifyDataSetChanged()
getItem
n'était pas appelé.Il s'agit en fait d'une fonctionnalité et non d'un bogue. Vous devez remplacer
getItemId
afin de pouvoir réutiliser correctement vos fragments. Depuis que vous supprimez des fragments, vos positions changent. Comme mentionné dans la documentation:Fournissez simplement un identifiant unique à chaque fragment et vous avez terminé.
L' utilisation d' un
FragementStatePagerAdapter
ou de retourPOSITION_NONE
enint getItemPosition (Object object)
est erroné. Vous n'obtiendrez aucune mise en cache.la source
getItemId
AND ajustergetItemPosition
pour retournerPOSITION_NONE
SI le fragment devait être supprimé. J'ai un indicateur d'énumération pour cela. Après celagetItem
sera appelé.J'ai fait ce que @kanika et @ Jraco11 avaient publié mais j'avais toujours le problème.
Donc, après de nombreux changements, j'en ai trouvé un qui fonctionnait pour moi et a été ajouté à mon FragmentPagerAdapter le code suivant:
Selon ce que j'ai lu, getItemPosition est utilisé pour notifier au ViewPager s'il faut ou non actualiser un élément, et pour éviter les mises à jour si les éléments aux positions visibles n'ont pas changé.
la source
Il existe deux scénarios différents: 1.) Vous avez la même disposition pour chaque pager: dans ce cas, il sera préférable d'étendre votre adaptateur personnalisé par PagerAdapter et de renvoyer une seule disposition.
2.) Vous avez une disposition différente pour chaque pager: dans ce cas, il sera préférable d'étendre votre adaptateur personnalisé par FragmentStatePagerAdapter et de renvoyer différents fragmets pour chaque pager.
la source
La méthode
getItem()
est utilisée uniquement pour créer de nouveaux éléments. Une fois qu'ils ont été créés, cette méthode ne sera pas appelée. Si vous avez besoin d'obtenir un article qui est la devise utilisée par l'adaptateur, utilisez cette méthode:la source
J'ai trouvé que la configuration d'un écouteur sur la mise en page des onglets a empêché cet appel, probablement parce qu'ils n'ont de l'espace que pour un auditeur au
tabLayout.setOnTabSelectedListener
lieu d'un tableau d'écouteurs.la source