Ich verwende den ViewPager aus der Kompatibilitätsbibliothek. Ich habe es erfolgreich dazu gebracht, mehrere Ansichten anzuzeigen, durch die ich blättern kann.
Es fällt mir jedoch schwer, herauszufinden, wie ich den ViewPager mit neuen Ansichten aktualisieren kann.
Ich habe alle möglichen Dinge versucht , wie der Aufruf mAdapter.notifyDataSetChanged()
, mViewPager.invalidate()
auch eine brandneue Adapter jedes Mal zu schaffen ich eine neue Liste der Daten verwendet werden soll.
Nichts hat geholfen, die Textansichten bleiben gegenüber den Originaldaten unverändert.
Update: Ich habe ein kleines Testprojekt erstellt und konnte die Ansichten fast aktualisieren. Ich werde die Klasse unten einfügen.
Was jedoch nicht zu aktualisieren scheint, ist die 2. Ansicht. Das 'B' bleibt erhalten. Nach dem Drücken der Update-Taste sollte 'Y' angezeigt werden.
public class ViewPagerBugActivity extends Activity {
private ViewPager myViewPager;
private List<String> data;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
data = new ArrayList<String>();
data.add("A");
data.add("B");
data.add("C");
myViewPager = (ViewPager) findViewById(R.id.my_view_pager);
myViewPager.setAdapter(new MyViewPagerAdapter(this, data));
Button updateButton = (Button) findViewById(R.id.update_button);
updateButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
updateViewPager();
}
});
}
private void updateViewPager() {
data.clear();
data.add("X");
data.add("Y");
data.add("Z");
myViewPager.getAdapter().notifyDataSetChanged();
}
private class MyViewPagerAdapter extends PagerAdapter {
private List<String> data;
private Context ctx;
public MyViewPagerAdapter(Context ctx, List<String> data) {
this.ctx = ctx;
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object instantiateItem(View collection, int position) {
TextView view = new TextView(ctx);
view.setText(data.get(position));
((ViewPager)collection).addView(view);
return view;
}
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
}
quelle
Antworten:
Es gibt verschiedene Möglichkeiten, dies zu erreichen.
Die erste Option ist einfacher, aber etwas ineffizienter.
Überschreiben Sie
getItemPosition
in IhremPagerAdapter
wie folgt :Auf diese Weise entfernt
notifyDataSetChanged()
der Ansichtspager beim Aufrufen alle Ansichten und lädt sie alle neu. Dadurch wird der Nachladeeffekt erhalten.Die zweite Option, die von Alvaro Luis Bustamante (zuvor alvarolb) vorgeschlagen wurde , besteht darin
setTag()
,instantiateItem()
beim Instanziieren einer neuen Ansicht eine Methode zu verwenden . Anstatt zu verwendennotifyDataSetChanged()
, können Sie dann diefindViewWithTag()
Ansicht suchen, die Sie aktualisieren möchten.Der zweite Ansatz ist sehr flexibel und leistungsstark. Ein großes Lob an Alvarolb für die ursprüngliche Forschung.
quelle
Ich glaube nicht, dass es irgendeinen Fehler in der gibt
PagerAdapter
. Das Problem ist, dass das Verständnis, wie es funktioniert, etwas komplex ist. Wenn ich mir die hier erläuterten Lösungen anschaue, gibt es aus meiner Sicht ein Missverständnis und daher eine schlechte Verwendung von instanziierten Ansichten.In den letzten Tagen habe ich mit
PagerAdapter
und gearbeitetViewPager
und Folgendes gefunden:Die
notifyDataSetChanged()
Methode auf demPagerAdapter
wird nur benachrichtigen,ViewPager
dass sich die zugrunde liegenden Seiten geändert haben. Wenn Sie beispielsweise Seiten dynamisch erstellt / gelöscht haben (Hinzufügen oder Entfernen von Elementen zu Ihrer Liste),ViewPager
sollte dies erledigt werden. In diesem Fall denke ich, dass dasViewPager
bestimmt, ob eine neue Ansicht mit den MethodengetItemPosition()
und gelöscht oder instanziiert werden sollgetCount()
.Ich denke, dass
ViewPager
nach einemnotifyDataSetChanged()
Anruf die untergeordneten Ansichten aufgenommen und ihre Position mit dem überprüft werdengetItemPosition()
. Wenn diese Methode für eine untergeordnete Ansicht zurückgegeben wirdPOSITION_NONE
,ViewPager
versteht das , dass die Ansicht gelöscht wurde, ruft die aufdestroyItem()
und entfernt diese Ansicht.Auf diese Weise ist das Überschreiben
getItemPosition()
, immer zurückzukehren,POSITION_NONE
völlig falsch, wenn Sie nur den Inhalt der Seiten aktualisieren möchten, da die zuvor erstellten Ansichten zerstört werden und bei jedem Aufruf neue erstellt werdennotifyDatasetChanged()
. Es scheint nicht nur für ein paarTextView
Sekunden so falsch zu sein , aber wenn Sie komplexe Ansichten haben, wie ListViews, die aus einer Datenbank ausgefüllt werden, kann dies ein echtes Problem und eine Verschwendung von Ressourcen sein.Es gibt also verschiedene Ansätze, um den Inhalt einer Ansicht effizient zu ändern, ohne die Ansicht entfernen und erneut instanziieren zu müssen. Dies hängt von dem Problem ab, das Sie lösen möchten. Mein Ansatz besteht darin, die
setTag()
Methode für jede instanziierte Ansicht in derinstantiateItem()
Methode zu verwenden. Wenn Sie also die Daten ändern oder die gewünschte Ansicht ungültig machen möchten, können Sie diefindViewWithTag()
Methode aufrufenViewPager
, um die zuvor instanziierte Ansicht abzurufen und sie nach Ihren Wünschen zu ändern / zu verwenden, ohne jedes Mal eine neue Ansicht löschen / erstellen zu müssen um einen Wert zu aktualisieren.Stellen Sie sich zum Beispiel vor, Sie haben 100 Seiten mit 100
TextView
s und möchten nur einen Wert regelmäßig aktualisieren. Mit den zuvor erläuterten Ansätzen bedeutet dies, dass SieTextView
bei jedem Update 100 s entfernen und instanziieren . Es ergibt keinen Sinn...quelle
setTag
Methode meinst. MöchtestonInstantiateItem
du diese Antwort mit etwas Codierung aktualisieren? Vielen Dank.Ändern Sie das
FragmentPagerAdapter
inFragmentStatePagerAdapter
.getItemPosition()
Methode überschreiben und zurückgebenPOSITION_NONE
.Schließlich wird der
notifyDataSetChanged()
On-View-Pager abgehört.quelle
Die Antwort von alvarolb ist definitiv der beste Weg, dies zu tun. Aufbauend auf seiner Antwort besteht eine einfache Möglichkeit, dies zu implementieren, darin, die aktiven Ansichten einfach nach Position zu speichern:
Wenn
notifyDataSetChanged
Sie dann einmal die Methode überschreiben , können Sie die Ansichten aktualisieren ...Sie können ähnlichen Code in
instantiateItem
und verwendennotifyDataSetChanged
, um Ihre Ansicht zu aktualisieren. In meinem Code verwende ich genau die gleiche Methode.quelle
Hatte das gleiche Problem. Für mich hat es funktioniert, FragmentStatePagerAdapter zu erweitern und die folgenden Methoden zu überschreiben:
quelle
Nach stundenlanger Frustration beim Ausprobieren aller oben genannten Lösungen, um dieses Problem zu überwinden, und auch beim Ausprobieren vieler Lösungen für andere ähnliche Fragen wie diese , dies und das, die alle mit mir gescheitert sind, um dieses Problem zu lösen und
ViewPager
das Alte zu zerstörenFragment
und daspager
mit zu füllen die neuenFragment
s. Ich habe das Problem wie folgt gelöst:1) Stellen Sie sicher, dass die
ViewPager
KlasseFragmentPagerAdapter
wie folgt erweitert wird:2) Erstellen Sie ein Element für das
ViewPager
, in dem dastitle
und dasfragment
folgende gespeichert sind :3) Lassen Sie den Konstruktor von
ViewPager
take myFragmentManager
instanceclass
wie folgt in my speichern :4) Erstellen Sie eine Methode zur Wieder stellen Sie die
adapter
Daten mit den neuen Daten durch alle vorherigen Löschenfragment
aus derfragmentManager
sich direkt um dieadapter
die neue zu setzenfragment
aus der neuen Liste wieder , wie folgend:5) Aus dem Container
Activity
oderFragment
initialisieren Sie den Adapter nicht neu mit den neuen Daten. Stellen Sie die neuen Daten durch die MethodesetPagerItems
mit den neuen Daten wie folgt ein:Ich hoffe, es hilft.
quelle
Ich hatte das gleiche Problem und meine Lösung verwendet das
FragmentPagerAdapter
Überschreiben vonFragmentPagerAdapter#getItemId(int position)
:Standardmäßig gibt diese Methode die Position des Elements zurück. Ich nehme an, dass
ViewPager
überprüft wird, obitemId
geändert wurde, und Seite nur neu erstellt, wenn es war. Die nicht überschriebene Version gibt jedoch dieselbe Position zurück wieitemId
auch wenn die Seite tatsächlich unterschiedlich ist, und ViewPager definiert nicht, dass die Seite ersetzt wird und neu erstellt werden muss.Um dies zu nutzen,
long id
wird für jede Seite benötigt. Normalerweise wird erwartet, dass es eindeutig ist, aber ich schlage für diesen Fall vor, dass es sich nur vom vorherigen Wert für dieselbe Seite unterscheiden sollte. Daher ist es hier möglich, einen kontinuierlichen Zähler in Adapter- oder Zufallszahlen (mit breiter Verteilung) zu verwenden.Ich denke, dass es konsequenter ist, Tags der Ansicht zu verwenden, die in diesem Thema als Lösung erwähnt werden. Aber wahrscheinlich nicht für alle Fälle.
quelle
PagerAdapter
. Welche Klasse ist das?FragmentPagerAdapter
Ich fand eine sehr interessante Entscheidung für dieses Problem. Anstelle von FragmentPagerAdapter , der alle Fragmente im Speicher behält, können wir FragmentStatePagerAdapter ( android.support.v4.app.FragmentStatePagerAdapter) verwenden ) verwenden, der das Fragment jedes Mal neu , wenn wir es auswählen.
Die Realisierungen beider Adapter sind identisch. Wir müssen also nur " FragmentPagerAdapter erweitern " in " FragmentStatePagerAdapter erweitern " ändern.
quelle
Nachdem ich viel nach diesem Problem gesucht hatte, fand ich eine wirklich gute Lösung, die meiner Meinung nach der richtige Weg ist, dies zu tun. Im Wesentlichen wird instantiateItem nur aufgerufen, wenn die Ansicht instanziiert wird, und nie wieder, es sei denn, die Ansicht wird zerstört (dies geschieht, wenn Sie die Funktion getItemPosition überschreiben, um POSITION_NONE zurückzugeben). Stattdessen möchten Sie speichern die erstellten Ansichten und entweder im Adapter aktualisieren, eine Get-Funktion generieren, damit jemand anderes sie aktualisieren kann, oder eine Set-Funktion, die den Adapter aktualisiert (mein Favorit).
Fügen Sie in Ihrem MyViewPagerAdapter eine Variable wie die folgende hinzu:
ein in Ihrem InstantiateItem:
Auf diese Weise können Sie eine Funktion erstellen, die Ihre Ansicht aktualisiert:
Hoffe das hilft!
quelle
instantiateItem
, deshalb wurden meine Ansichten nicht aktualisiert. Aus deiner Antwort habe ich es erkannt. +1Zweieinhalb Jahre nachdem das OP seine Frage gestellt hat, ist dieses Thema immer noch ein Thema. Es ist offensichtlich, dass Googles Priorität in dieser Hinsicht nicht besonders hoch ist. Anstatt eine Lösung zu finden, habe ich eine Problemumgehung gefunden. Der große Durchbruch für mich war herauszufinden, was die wahre Ursache des Problems war (siehe die akzeptierte Antwort in diesem Beitrag ). Als sich herausstellte, dass das Problem darin bestand, dass aktive Seiten nicht ordnungsgemäß aktualisiert wurden, war meine Problemumgehung offensichtlich:
In meinem Fragment (den Seiten):
In meiner Aktivität, in der ich die Seiten lade:
Wenn Sie danach einen zweiten Satz von Seiten neu laden, führt der Fehler immer noch dazu, dass einige die alten Daten anzeigen. Sie werden jetzt jedoch aktualisiert und Sie sehen die neuen Daten. Ihre Benutzer wissen nicht, dass die Seite jemals falsch war, da diese Aktualisierung erfolgt, bevor sie die Seite sehen.
Hoffe das hilft jemandem!
quelle
All diese Lösungen haben mir nicht geholfen. So fand ich eine funktionierende Lösung: Sie können
setAdapter
jedes Mal, aber es ist nicht genug. Sie sollten dies tun, bevor Sie den Adapter wechseln:und danach:
quelle
ViewPager
Innenfragment verwendet, also ersetztslideShowPagerAdapter.getFragmentManager()
durchgetChildFragmentManager()
. VielleichtgetFragmentManager()
hilft in Ihrem Fall. Ich habeFragmentPagerAdapter
nicht benutztFragmentStatePagerAdapter
. Siehe auch stackoverflow.com/a/25994654/2914140 für einen hackigen Weg.Ein viel einfacherer Weg: Verwenden Sie a
FragmentPagerAdapter
und wickeln Sie Ihre Seitenansichten in Fragmente ein. Sie werden aktualisiertquelle
Vielen Dank an rui.araujo und Alvaro Luis Bustamante. Zuerst versuche ich, den Weg von rui.araujo zu benutzen, weil es einfach ist. Es funktioniert, aber wenn sich die Daten ändern, wird die Seite offensichtlich neu gezeichnet. Es ist schlecht, also versuche ich, Alvaro Luis Bustamantes Weg zu benutzen. Es ist perfekt. Hier ist der Code:
Und wenn sich Daten ändern:
quelle
Nur für den Fall, dass jemand FragmentStatePagerAdapter verwendet basierten Adapter verwendet (mit dem ViewPager die für die Anzeige erforderlichen Mindestseiten erstellen kann, in meinem Fall höchstens 2), verursacht die Antwort von @ rui.araujo, getItemPosition in Ihrem Adapter zu überschreiben, keine erhebliche Verschwendung, aber dennoch Kann verbessert werden.
Im Pseudocode:
quelle
getItemPosition()
wenn sich das Dataset geändert hat, und ViewPager erkennt, dass sie geändert wurden oder nicht. ViewPager hat es leider nicht getan.Ich hatte ein ähnliches Problem, bei dem ich vier Seiten hatte und eine der Seiten die Ansichten der anderen drei Seiten aktualisierte. Ich konnte die Widgets (SeekBars, TextViews usw.) auf der Seite neben der aktuellen Seite aktualisieren. Die letzten beiden Seiten hätten beim Aufrufen nicht initialisierte Widgets
mTabsAdapter.getItem(position)
.Um mein Problem zu lösen, habe ich
setSelectedPage(index)
vor dem Anruf verwendetgetItem(position)
. Dies würde die Seite instanziieren und es mir ermöglichen, Werte und Widgets auf jeder Seite zu ändern.Nach all dem Update würde ich
setSelectedPage(position)
gefolgt von verwendennotifyDataSetChanged()
.Sie können ein leichtes Flackern in der ListView auf der Hauptaktualisierungsseite sehen, aber nichts Auffälliges. Ich habe es nicht gründlich getestet, aber es löst mein unmittelbares Problem.
quelle
Ich poste diese Antwort nur für den Fall, dass jemand anderes sie nützlich findet. Um genau das Gleiche zu tun, habe ich einfach den Quellcode von ViewPager und PagerAdapter aus der Kompatibilitätsbibliothek genommen und in meinem Code kompiliert (Sie müssen alle Fehler und Importe selbst aussortieren, aber es kann definitiv durchgeführt werden).
Erstellen Sie dann im CustomViewPager eine Methode namens updateViewAt (int position). Die Ansicht selbst kann von ArrayList-Elementen abgerufen werden, die in der ViewPager-Klasse definiert sind (Sie müssen eine ID für die Ansichten beim Instanziieren des Elements festlegen und diese ID mit der Position in der updateViewAt () -Methode vergleichen). Anschließend können Sie die Ansicht nach Bedarf aktualisieren.
quelle
Ich denke, ich habe die Logik von ViewPager.
Wenn ich eine Reihe von Seiten aktualisieren und basierend auf einem neuen Dataset anzeigen muss, rufe ich notifyDataSetChanged () auf . Anschließend ruft ViewPager getItemPosition () mehrfach auf und übergibt dort Fragment als Objekt. Dieses Fragment kann entweder aus einem alten Datensatz (den ich verwerfen möchte) oder aus einem neuen Datensatz (den ich anzeigen möchte) stammen. Also überschreibe ich getItemPosition () und muss dort irgendwie feststellen, ob mein Fragment aus dem alten oder aus dem neuen Datensatz stammt.
In meinem Fall habe ich ein Layout mit zwei Fenstern mit einer Liste der wichtigsten Elemente im linken Bereich und einer Wischansicht (ViewPager) im rechten Bereich. Daher speichere ich einen Link zu meinem aktuellen Top-Element in meinem PagerAdapter und auch in jedem instanziierten Seitenfragment. Wenn sich das ausgewählte oberste Element in der Liste ändert, speichere ich das neue oberste Element in PagerAdapter und rufe notifyDataSetChanged () auf . Und in der überschriebenen getItemPosition () vergleiche ich das oberste Element aus meinem Adapter mit dem obersten Element aus meinem Fragment. Und nur wenn sie nicht gleich sind, gebe ich POSITION_NONE zurück. Anschließend stellt PagerAdapter alle Fragmente wieder her, die POSITION_NONE zurückgegeben haben.
HINWEIS. Das Speichern der obersten Element-ID anstelle einer Referenz ist möglicherweise eine bessere Idee.
Das folgende Code-Snippet ist etwas schematisch, aber ich habe es aus dem tatsächlich funktionierenden Code angepasst.
Vielen Dank für alle bisherigen Forscher!
quelle
Der folgende Code hat bei mir funktioniert.
Erstellen Sie eine Klasse, die die FragmentPagerAdapter-Klasse wie folgt erweitert.
Erstellen Sie dann in jedem von Ihnen erstellten Fragment eine updateFragment-Methode. Bei dieser Methode ändern Sie die Dinge, die Sie im Fragment ändern müssen. In meinem Fall enthielt Fragment0 beispielsweise eine GLSurfaceView, die ein 3D-Objekt basierend auf einem Pfad zu einer .ply-Datei anzeigt. Daher ändere ich in meiner updateFragment-Methode den Pfad zu dieser Ply-Datei.
Erstellen Sie dann eine ViewPager-Instanz.
und eine Adpater-Instanz,
dann mach das,
Dann haben Sie innerhalb der Klasse die Adapterklasse oben initialisiert und einen viewPager erstellt. Verwenden Sie jedes Mal, wenn Sie eines Ihrer Fragmente (in unserem Fall Fragment0) aktualisieren möchten, Folgendes:
Diese Lösung basierte auf der von Alvaro Luis Bustamante vorgeschlagenen Technik.
quelle
1. Zuerst müssen Sie die getItemposition-Methode in Ihrer Pageradapter-Klasse festlegen. 2. Sie müssen die genaue Position Ihres View Pager lesen. 3. Dann senden Sie diese Position als Datenspeicherort Ihres neuen Pagers. 4. Schreiben Sie die Aktualisierungsschaltfläche, indem Sie auf den Listener in setonPageChange klicken Hörer
Dieser Programmcode wurde ein wenig geändert, um nur das bestimmte Positionselement festzulegen
quelle
Was für mich funktionierte, ging
viewPager.getAdapter().notifyDataSetChanged();
und in den Adapter geben Sie Ihren Code zum Aktualisieren der Ansicht
getItemPosition
wie folgt einVielleicht ist es nicht die richtige Vorgehensweise, aber es hat funktioniert (der
return POSITION_NONE
Trick verursachte einen Absturz für mich, war also keine Option).quelle
Sie können alle Fragmente dynamisch aktualisieren, was Sie in drei Schritten sehen können.
In Ihrem Adapter:
Jetzt in Ihrer Aktivität:
Zum Schluss in Ihrem Fragment so etwas:
Den vollständigen Code finden Sie hier .
Vielen Dank, Alvaro Luis Bustamante.
quelle
Immer zurückzukehren
POSITION_NONE
ist einfach, aber ein wenig ineffizient, da dies die Instanziierung aller Seiten hervorruft, die bereits instanziiert wurden.Ich habe eine Bibliothek ArrayPagerAdapter erstellt , um Elemente in PagerAdapters dynamisch zu ändern.
Intern Bring diese Bibliothek Adapter
POSITION_NONE
aufgetItemPosiition()
nur bei Bedarf.Mithilfe dieser Bibliothek können Sie Elemente dynamisch wie folgt ändern.
Die Thils-Bibliothek unterstützt auch von Fragmenten erstellte Seiten.
quelle
Dies ist für alle wie mich, die den Viewpager von einem Dienst (oder einem anderen Hintergrund-Thread) aktualisieren müssen und keiner der Vorschläge hat funktioniert: Nach einigem Überprüfen der Protokollierung wurde mir klar, dass die notifyDataSetChanged () -Methode niemals zurückkehrt. getItemPosition (Object object) wird dort ohne weitere Verarbeitung als All-Ends bezeichnet. Dann fand ich in den Dokumenten der übergeordneten PagerAdapter-Klasse (nicht in den Dokumenten der Unterklassen): "Datensatzänderungen müssen im Hauptthread auftreten und mit einem Aufruf von notifyDataSetChanged () enden." Die Arbeitslösung in diesem Fall war also (unter Verwendung von FragmentStatePagerAdapter und getItemPosition (Objektobjekt) so eingestellt, dass POSITION_NONE zurückgegeben wird):
und dann den Aufruf von notifyDataSetChanged ():
quelle
Sie können die Pager-Transformation in Viewpager wie folgt hinzufügen
Im folgenden Code habe ich meine Ansichtsfarbe zur Laufzeit beim Scrollen des Pagers geändert
quelle
Ich weiß, ich bin verdammt spät, aber es kann trotzdem jemandem helfen. Ich erweitere nur die entsprechende Antwort und habe auch den Kommentar dazu hinzugefügt.
Gut,
Die Antwort selbst besagt, dass es ineffizient ist
Um es nur bei Bedarf zu aktualisieren, können Sie dies tun
quelle
ViewPager wurde nicht für die Unterstützung dynamischer Ansichtsänderungen entwickelt.
Ich hatte eine Bestätigung, als ich nach einem anderen Fehler im Zusammenhang mit diesem https://issuetracker.google.com/issues/36956111 und insbesondere https://issuetracker.google.com/issues/36956111#comment56 suchte
Diese Frage ist etwas alt, aber Google hat dieses Problem kürzlich mit ViewPager2 gelöst . Damit können handgefertigte (nicht gewartete und möglicherweise fehlerhafte) Lösungen durch Standardlösungen ersetzt werden. Es verhindert auch, dass Ansichten unnötig neu erstellt werden, wie dies bei einigen Antworten der Fall ist.
Beispiele für ViewPager2 finden Sie unter https://github.com/googlesamples/android-viewpager2
Wenn Sie ViewPager2 verwenden möchten, müssen Sie der Datei build.gradle die folgende Abhängigkeit hinzufügen:
Anschließend können Sie Ihren ViewPager in Ihrer XML-Datei durch Folgendes ersetzen:
Danach müssen Sie ViewPager in Ihrer Aktivität durch ViewPager2 ersetzen
ViewPager2 benötigt entweder einen RecyclerView.Adapter oder einen FragmentStateAdapter. In Ihrem Fall kann es sich um einen RecyclerView.Adapter handeln
Wenn Sie ein TabLayout verwendet haben, können Sie einen TabLayoutMediator verwenden:
Anschließend können Sie Ihre Ansichten aktualisieren, indem Sie die Daten Ihres Adapters ändern und die notifyDataSetChanged-Methode aufrufen
quelle
Anstatt
POSITION_NONE
alle Fragmente zurückzugeben und erneut zu erstellen, können Sie Folgendes tun: ViewPager dynamisch aktualisieren?quelle
Ich glaube, ich habe eine einfache Möglichkeit gefunden, um Änderungen an Datensätzen zu melden:
Ändern Sie zunächst die Funktionsweise der Funktion instantiateItem ein wenig:
Füllen Sie für "updateView" die Ansicht mit allen Daten, die Sie füllen möchten (setText, setBitmapImage, ...).
Stellen Sie sicher, dass destroyView folgendermaßen funktioniert:
Angenommen, Sie müssen die Daten ändern, dies tun und dann die nächste Funktion im PagerAdapter aufrufen:
Wenn Sie beispielsweise alle vom viewPager angezeigten Ansichten benachrichtigen möchten, dass sich etwas geändert hat, können Sie Folgendes aufrufen:
Das ist es.
quelle
Für das, was es wert ist, scheint es auf KitKat +
adapter.notifyDataSetChanged()
genug zu sein, um die neuen Ansichten anzuzeigen, vorausgesetzt, Sie sindsetOffscreenPageLimit
ausreichend hoch. Ich bin in der Lage, das gewünschte Verhalten zu erreichenviewPager.setOffscreenPageLimit(2)
.quelle
Ich benutze tatsächlich
notifyDataSetChanged()
anViewPager
undCirclePageIndicator
und danach rufe ichdestroyDrawingCache()
anViewPager
und es funktioniert. Keine der anderen Lösungen hat für mich funktioniert.quelle