Nie mogę ponownie użyć fragmentu w FragmentPagerAdapter .. Używając metody zniszczenia (), usuwa fragment, ale nadal nie wywołuje ponownie getItem (). Są tylko 2-3 obrazy, więc używam FragmentPagerAdapter zamiast 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;
}
}
I In FragmentActivity,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
destroyItem()
? To nie jest konieczne.Odpowiedzi:
Odpowiedź KISS:
Proste użycie FragmentStatePagerAdapter zamiast FragmentPagerAdapter .
Dostałem odpowiedź ... Najpierw pomyślałem, że skasuję to pytanie, ponieważ robię bardzo głupi błąd, ale ta odpowiedź pomoże komuś, kto ma ten sam problem, którego Zamiast
FragmentPagerAdapter
używaćFragmentStatePagerAdapter
.Jak @BlackHatSamurai wspomniał w komentarzu:
źródło
Użycie a
FragmentStatePagerAdapter
nie rozwiązało w pełni mojego problemu, który był podobnym problemem, gdyonCreateView
nie było wywoływanych fragmentów podrzędnych na stronie widoku. Faktycznie zagnieżdżam swojeFragmentPagerAdapter
wnętrze w innym,Fragment
dlategoFragmentManager
plik był współdzielony przez wszystkie z nich, zachowując w ten sposób wystąpienia starych fragmentów. Rozwiązanie polegało na tym, że zamiast tego przekazano instancjęgetChildFragmentManager
do konstruktoraFragmentPagerAdapter
fragmentu w moim hoście. Coś jak...getChildFragmentManager()
Metoda jest dostępny za pośrednictwem fragmentu i to pracował dla mnie, ponieważ zwraca prywatnyFragmentManager
do tego fragmentu z myślą o sytuacjach, w których konieczne jest zagnieżdżanie fragmenty. Mam nadzieję, że pomoże to komuś, kto może mieć ten sam problem co ja !!getChildFragmentManager()
minimalnej wersji API, musi być co najmniej17 (4.2)
, więc może to rzucić kluczem w twoje koła zębate. Oczywiście, jeśli używasz fragmentów z biblioteki wsparcia v4, powinieneś być w porządku.źródło
Nadpisanie
long getItemId (int position)
FragmentPagerAdapter
buforuje utworzone przez siebie fragmenty za pomocągetItem
. Miałem ten sam problem - nawet po telefonienotifyDataSetChanged()
getItem
nie .W rzeczywistości jest to funkcja, a nie błąd. Musisz nadpisać
getItemId
, aby móc poprawnie ponownie wykorzystać swoje fragmenty. Ponieważ usuwasz fragmenty, twoje pozycje się zmieniają. Jak wspomniano w dokumentach:Po prostu podaj unikalny identyfikator dla każdego fragmentu i gotowe.
Używanie
FragementStatePagerAdapter
lub powrotuPOSITION_NONE
wint getItemPosition (Object object)
to źle. Nie otrzymasz żadnego buforowania.źródło
getItemId
AND dostosować,getItemPosition
aby zwrócić,POSITION_NONE
JEŚLI fragment powinien zostać usunięty. Mam do tego flagę wyliczenia. Po tymgetItem
zostanie wywołany.Zrobiłem to, co opublikowali @kanika i @ Jraco11, ale nadal miałem problem.
Tak więc po wielu zmianach znalazłem taki, który działał dla mnie i został dodany do mojego FragmentPagerAdapter z następnym kodem:
Zgodnie z tym, co przeczytałem, getItemPosition służy do powiadamiania ViewPagera, czy odświeżyć element, oraz do uniknięcia aktualizacji, jeśli elementy w widocznych pozycjach nie uległy zmianie.
źródło
Istnieją dwa różne scenariusze: 1.) Masz taki sam układ dla każdego pagera: w takim przypadku będzie lepiej, jeśli rozszerzysz swój niestandardowy adapter o PagerAdapter i zwrócisz pojedynczy układ.
2.) Masz inny układ dla każdego pagera: w takim przypadku będzie lepiej, jeśli rozszerzysz swój niestandardowy adapter o FragmentStatePagerAdapter i zwrócisz różne fragmenty dla każdego pagera.
źródło
Metoda
getItem()
służy tylko do tworzenia nowych pozycji. Po utworzeniu ta metoda nie zostanie wywołana. Jeśli chcesz uzyskać przedmiot, który jest walutą używaną przez adapter, użyj tej metody:źródło
Zauważyłem, że ustawienie listenera w układzie tabulatora uniemożliwiło wywołanie tego, prawdopodobnie dlatego, że mają miejsce tylko dla jednego słuchacza
tabLayout.setOnTabSelectedListener
zamiast tablicy słuchaczy.źródło