Ich kann das Fragment in FragmentPagerAdapter nicht wiederverwenden. Mit der Methode destroyItem () wird das Fragment gelöscht, aber immer noch nicht erneut getItem () aufgerufen. Es gibt nur 2-3 Bilder, daher verwende ich FragmentPagerAdapter anstelle von 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;
}
}
Und in FragmentActivity,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
destroyItem()
? Das ist nicht nötig.Antworten:
KISS Antwort:
Verwenden Sie einfach FragmentStatePagerAdapter anstelle von FragmentPagerAdapter .
Ich habe die Antwort erhalten. Zuerst dachte ich, diese Frage zu löschen, da ich einen sehr dummen Fehler mache, aber diese Antwort hilft jemandem, der mit dem gleichen Problem konfrontiert ist, das stattdessen
FragmentPagerAdapter
verwendet wirdFragmentStatePagerAdapter
.Wie @BlackHatSamurai im Kommentar erwähnt:
quelle
Die Verwendung von a
FragmentStatePagerAdapter
hat mein Problem nicht vollständig behoben. Dies war ein ähnliches Problem, bei demonCreateView
im Ansichtspager keine untergeordneten Fragmente aufgerufen wurden. Ich verschachteleFragmentPagerAdapter
Fragment
tatsächlich mein Inneres in einem anderen, daherFragmentManager
wurde das in allen geteilt und behält so Instanzen der alten Fragmente bei. Das Update bestand darin, stattdessen eine Instanz vongetChildFragmentManager
dem Konstruktor vonFragmentPagerAdapter
in meinem Host-Fragment zuzuführen. Etwas wie...Auf die
getChildFragmentManager()
Methode kann über ein Fragment zugegriffen werden, und dies hat bei mir funktioniert, da sieFragmentManager
für dieses Fragment eine private zurückgibt , insbesondere für Situationen, in denen Verschachtelungsfragmente benötigt werden. Ich hoffe, das hilft jemandem, der vielleicht das gleiche Problem hat wie ich !!getChildFragmentManager()
Ihrer Mindest-API-Version mindestens erfolgen muss17 (4.2)
, damit dies einen Schraubenschlüssel in Ihre Zahnräder werfen kann. Wenn Sie Fragmente aus der Support-Bibliothek v4 verwenden, sollten Sie natürlich in Ordnung sein.quelle
Überschreiben
long getItemId (int position)
FragmentPagerAdapter
speichert die Fragmente zwischen, die es mit erstelltgetItem
. Ich hatte das gleiche Problem - auch nachdemnotifyDataSetChanged()
getItem
nicht angerufen wurde.Dies ist eigentlich eine Funktion und kein Fehler. Sie müssen überschreiben,
getItemId
damit Sie Ihre Fragmente korrekt wiederverwenden können. Da Sie Fragmente entfernen, ändern sich Ihre Positionen. Wie in den Dokumenten erwähnt:Geben Sie einfach für jedes Fragment eine eindeutige ID ein, und fertig.
Ein Verwenden
FragementStatePagerAdapter
oder der RückkehrPOSITION_NONE
inint getItemPosition (Object object)
ist falsch. Sie erhalten kein Caching.quelle
getItemId
AND angeben,getItemPosition
um zurückzugeben,POSITION_NONE
WENN das Fragment entfernt werden sollte. Ich habe eine Enum-Flagge dafür. DanachgetItem
wird aufgerufen.Ich habe getan, was @kanika und @ Jraco11 gepostet hatten, aber ich hatte immer noch das Problem.
Nach vielen Änderungen fand ich eine, die für mich funktionierte, und meinem FragmentPagerAdapter wurde der nächste Code hinzugefügt:
Nach dem, was ich gelesen habe, wird getItemPosition verwendet, um den ViewPager zu benachrichtigen, ob ein Element aktualisiert werden soll oder nicht, und um Aktualisierungen zu vermeiden, wenn sich die Elemente an den sichtbaren Positionen nicht geändert haben.
quelle
Es gibt zwei verschiedene Szenarien: 1.) Sie haben für jeden Pager das gleiche Layout: In diesem Fall ist es besser, wenn Sie Ihren benutzerdefinierten Adapter um PagerAdapter erweitern und ein einzelnes Layout zurückgeben.
2.) Sie haben für jeden Pager ein anderes Layout: In diesem Fall ist es besser, wenn Sie Ihren benutzerdefinierten Adapter um FragmentStatePagerAdapter erweitern und für jeden Pager unterschiedliche Fragmets zurückgeben.
quelle
Methode
getItem()
wird nur verwendet, um neue Elemente zu erstellen. Nach der Erstellung wird diese Methode nicht mehr aufgerufen. Verwenden Sie diese Methode, wenn Sie einen Artikel benötigen, dessen Währung vom Adapter verwendet wird:quelle
Ich fand heraus, dass das Festlegen eines Listeners im Registerkartenlayout den Aufruf dieses Listeners verhinderte, wahrscheinlich weil nur Platz für einen Listener
tabLayout.setOnTabSelectedListener
anstelle eines Arrays von Listenern vorhanden ist.quelle