Ich habe eine ArrayList
mit benutzerdefinierten Objekten. Jedes benutzerdefinierte Objekt enthält eine Vielzahl von Zeichenfolgen und Zahlen. Ich benötige das Array auch dann, wenn der Benutzer die Aktivität verlässt und zu einem späteren Zeitpunkt zurückkehren möchte, aber ich brauche das Array nicht, wenn die Anwendung vollständig geschlossen wurde. Ich speichere eine Menge anderer Objekte auf diese Weise, indem ich die SharedPreferences
aber ich kann nicht herausfinden, wie ich mein gesamtes Array auf diese Weise speichern kann. Ist das möglich? Vielleicht SharedPreferences
ist nicht der richtige Weg, dies zu tun? Gibt es eine einfachere Methode?
Antworten
Zu viele Anzeigen?Auch mit Kotlin:
fun SharedPreferences.Editor.putIntegerArrayList(key: String, list: ArrayList<Int>?): SharedPreferences.Editor {
putString(key, list?.joinToString(",") ?: "")
return this
}
fun SharedPreferences.getIntegerArrayList(key: String, defValue: ArrayList<Int>?): ArrayList<Int>? {
val value = getString(key, null)
if (value.isNullOrBlank())
return defValue
return ArrayList (value.split(",").map { it.toInt() })
}
Sie können String und benutzerdefinierte Array-Liste mit Gson-Bibliothek speichern.
\=>Zuerst müssen Sie eine Funktion zum Speichern der Array-Liste in SharedPreferences erstellen.
public void saveListInLocal(ArrayList<String> list, String key) {
SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply(); // This line is IMPORTANT !!!
}
\=> Sie müssen eine Funktion erstellen, um die Array-Liste von SharedPreferences zu erhalten.
public ArrayList<String> getListFromLocal(String key)
{
SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
return gson.fromJson(json, type);
}
\=> So rufen Sie die Funktion zum Speichern und Abrufen von Array-Listen auf.
ArrayList<String> listSave=new ArrayList<>();
listSave.add("test1"));
listSave.add("test2"));
saveListInLocal(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<String> listGet=new ArrayList<>();
listGet=getListFromLocal("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());
\=> Vergessen Sie nicht, die gson-Bibliothek in Ihre App-Ebene build.gradle hinzuzufügen.
Implementierung 'com.google.code.gson:gson:2.8.2'
Ich habe alle obigen Antworten gelesen. Das ist alles richtig, aber ich fand eine einfachere Lösung wie unten:
-
Speichern der Zeichenkettenliste in der gemeinsamen Präferenz>>
public static void setSharedPreferenceStringList(Context pContext, String pKey, List<String> pData) { SharedPreferences.Editor editor = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit(); editor.putInt(pKey + "size", pData.size()); editor.commit(); for (int i = 0; i < pData.size(); i++) { SharedPreferences.Editor editor1 = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit(); editor1.putString(pKey + i, (pData.get(i))); editor1.commit(); }
}
-
und für das Abrufen der String-Liste von Shared-preference>>
public static List<String> getSharedPreferenceStringList(Context pContext, String pKey) { int size = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getInt(pKey + "size", 0); List<String> list = new ArrayList<>(); for (int i = 0; i < size; i++) { list.add(pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getString(pKey + i, "")); } return list; }
Hier Constants.APP_PREFS
ist der Name der zu öffnenden Datei; darf keine Pfadseparatoren enthalten.
Verwendung von Kotlin und GSON:
fun <T> SharedPreferences.writeList(gson: Gson, key: String, data: List<T>) {
val json = gson.toJson(data)
edit { putString(key, json) }
}
inline fun <reified T> SharedPreferences.readList(gson: Gson, key: String): List<T> {
val json = getString(key, "[]") ?: "[]"
val type = object : TypeToken<List<T>>() {}.type
return try {
gson.fromJson(json, type)
} catch(e: JsonSyntaxException) {
emptyList()
}
}