Speichern und wiederherstellen des ListView-Steuerelements mit Benutzerdefinierten Liste-Adapter
Ich bin derzeit mit einem custom list adapter
und ändern die Zeilen der listview zur Laufzeit (ändern von text, Schaltflächen usw.).
Möchte ich einen Weg finden, speichern/wiederherstellen der änderungen der listview
zur Laufzeit, wenn ich beginne ein weiteres fragment und dann wieder kommen, um das fragment mit der listview.
Derzeit die listview neu geladen wird jedes mal, und alle runtime-änderungen sind verloren.
Folgende zeigt, wie ich bin Einstellung der Liste-adapter.
public void setAdapterToListView(ArrayList<item> list) {
ItemList = list;
ItemAdapter adapter = new MenuItemAdapter(list, getActivity(), this);
ItemListView.setAdapter(adapter);
}
Bin ich dann mit einer benutzerdefinierten Liste-adapter, um die änderungen vorzunehmen (wie bereits erwähnt) während der Laufzeit. Hier ist ein snippet, wie ich bin, Dinge zu verändern zur Laufzeit:
if (holder.qty.getText().toString().equals("Qty")) {
relativeLayout.setBackgroundColor(row.getResources().getColor(R.color.navDrawerL ightBlue));
holder.qty.setText("1");
holder.qty.startAnimation(anim);
holder.removeItem.setBackgroundResource(R.drawable.remove_item_red);
holder.removeItem.setEnabled(true);
...
Gibt es eine empfohlene Weg, um dieses Problem Herangehen?
- Look up wie zu verwenden, speichern und wiederherstellen der Instanz, Zustand. Es ist Teil der Activity-und Fragment-Lebenszyklus und können gefunden werden in den offiziellen android-API-Referenz. Siehe: developer.android.com/training/basics/activity-lifecycle/... (dies ist für eine Aktivität, sondern es gilt für die Fragmente zu)
- Ich kann nicht verstehen, Ihr Problem. Sie verwenden eine benutzerdefinierte adapter-aber das ist nicht im Zusammenhang, wie Sie das speichern der Listview-Daten. Können Sie einfach speichern Sie Ihre ArrayList im cache, bis die app beendet? Oder brauchen Sie eine Datenbank für das Listview-Daten zu speichern, die Sie auch nach app beendet?
- Ich bin das abrufen der Daten für das listview-von einem server, so dass ist nicht das Problem. Das listview-Steuerelement geändert werden kann, indem der user per button-Klicks usw. Es ist im wesentlichen ein Warenkorb. Ich will, um sicherzustellen, dass diese änderungen auf die listview gespeichert und können wiederhergestellt werden. Ist es möglich zu bewahren, den Zustand der gesamten listview?
- Die wichtigsten staatlichen meiner Meinung nach ist die Zeile, position und die Sortierreihenfolge der Listview. Aber wenn Sie wollen etwas umfangreicher, Blick auf Serializable, developer.android.com/reference/java/io/Serializable.html . Wenn Sie dieses design, tag-Ihre Frage mit Serializable.
- Können Sie Ihre adapter-code? Oder wenigstens den relevanten code zu zeigen, wie verfolgen Sie die änderungen auf den text, buttons, etc in den adapter.
- Ich habe einige code zeigt einen Teil von dem, was ich ändern bin in den adapter.
- Also dann...ist es die Daten in den adapter selbst, der bekommt mutierte die änderungen, wie das ListView angezeigt, die den Benutzer? Ich nehme an, Sie füllen
qty
Textfeld mit solchen Daten. - so, basierend auf Benutzer-Interaktion mit dem listview-ich ändern, was dem Nutzer angezeigt werden (Menge, Preis etc). So ja, die Daten innerhalb der adapter selbst ist, was bekommt mutiert. Dies erfolgt über klicken Sie auf die Zuhörer. Der plan ist, speichern Sie diese Daten geändert haben, und dann schicken Sie es an den server für die Verarbeitung etc. Ich versuche, herauszufinden, ein Fluss der Logik, um diese zu bewältigen, sowie beibehalten, die änderungen an der listview, so dass ein Benutzer kann 'wieder aus' dieser Ansicht, und dann kommen Sie zurück und sehen Sie alles wie Sie es verlassen hatten (mutierte Daten intakt). Ich hoffe das macht Sinn?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Adapter
Werden Sie wollen Ihre eigene adapter zu implementieren, eine Art getter für interne Daten. Zum Beispiel
Aktivität
Dann in der activity/fragment, müssen Sie zum speichern und wiederherstellen von Daten.
Während es ist ein
onRestoreInstanceState()
Methode könnte man überschreiben, den ich in der Regel wiederherstellen, währendonCreate()
. In der Regel bequemer, wenn andere Dinge werden immer instanziiert werden. Entweder-oder lebensfähig ist.YourDataType
Du nicht erwähnt, was
YourDataType
war, aber ich nehme an, es ist eine benutzerdefinierte Klasse. Um die Arbeit mit dem gebündelten savedstate, muss es implementierenParcelable
. Android dev link auf Parcelable und ein StackOverFlow post erklären, wie schreiben Sie Ihre eigenen benutzerdefinierten Klasse mit Parcelable.Update
Je nachdem, was Sie tun, mit dem fragment wird diktieren, wenn der
onSavedInstanceState()
- Methode aufgerufen werden. Aus der Art, wie Sie Ihre Frage gestellt, ich nehme an, Sie drängen ein fragment auf dem backstack zu laden, ein weiteres an der Spitze. Dann schlagen die zurück-Taste wird nachgeladen, das fragment aus dem backstack...und pass entlang der gebündelt Staat, um neu zu laden aus.Das ist natürlich nur eine von vielen Szenarien. Es ist durchaus möglich, das fragment in Frage, um nur
onPause()
gefolgt vononStop()
...dann, wenn redisplaying das fragment, nur sehen es tunonStart()
gefolgt vononResume()
. In diesem Fall würde es nicht werden einem gespeicherten Zustand, da das fragment wurde nie völlig zerstört, so gibt es nichts zum wiederherstellen. Es sollte in dem gleichen Zustand. Wenn es nicht und Sie werden sehen, es laden der ersten Daten...dann sind Sie wahrscheinlich das laden der ersten Daten, die in oder nachonStart()
. Sie verschieben wollen alle, dass die Initialisierung Daten zuonCreate()
statt.Andere mögliche Fall ist, dass Sie vollständig zu zerstören das fragment, ohne jemals indem es auf dem backstack. Re-initialisieren wäre, hätte es nicht einen gespeicherten Zustand zu ziehen aus. Wenn Sie wollten, um die "Wiederherstellung" dieses fragment wieder in den Zustand vorher, dann kann man sich nicht auf
onSavedInstanceState()
. Sie müssen anhalten, die Informationen manuell irgendwo im Speicher, auf die Festplatte oder eine DB selbst. Dann zieht es entsprechend.Leben Zyklen mit Fragmenten sind leider sehr Komplex und stark abhängig von der Nutzung und sogar zwischen die support-Bibliothek vs native Fragmente.
Nach etwas Lesen/recherche landete ich beim lösen dieser durch die Einsparung der adapter die Daten zu Gespeicherten Einstellungen mittels Gson (https://code.google.com/p/google-gson/).
Ich Gson verwendet, um zuerst konvertieren mein array von Objekten in Json und speicherte dann die Json-strings in den Gespeicherten Einstellungen.
Anschließend war ich in der Lage, abrufen und diese als erforderlich und Lesen Sie die Json in Java-Objekte erneut, speichern diese in einem array-Liste und übergeben Sie diese zu meiner listview-adapter.
Hier ein kurzer überblick über den Prozess für jemanden, der etwas ähnliches zu tun.
Speichern, um Gemeinsame Vorlieben:
Lesen von Shared Preferences: