376 Stimmen

ArrayList in SharedPreferences speichern

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?

2voto

Maulik Gohel Punkte 51
//Set the values
intent.putParcelableArrayListExtra("key",collection);

//Retrieve the values
ArrayList<OnlineMember> onlineMembers = data.getParcelableArrayListExtra("key");

2voto

Carlos Silva Punkte 544

Warum kleben Sie Ihre Array-Liste nicht in eine Anwendungsklasse? Sie wird nur zerstört, wenn die Anwendung wirklich getötet, also wird es so lange bleiben, wie die App verfügbar ist.

2voto

Yuliia Ashomok Punkte 7783

Verwenden Sie diese benutzerdefinierte Klasse:

public class SharedPreferencesUtil {

    public static void pushStringList(SharedPreferences sharedPref, 
                                      List<String> list, String uniqueListName) {

        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putInt(uniqueListName + "_size", list.size());

        for (int i = 0; i < list.size(); i++) {
            editor.remove(uniqueListName + i);
            editor.putString(uniqueListName + i, list.get(i));
        }
        editor.apply();
    }

    public static List<String> pullStringList(SharedPreferences sharedPref, 
                                              String uniqueListName) {

        List<String> result = new ArrayList<>();
        int size = sharedPref.getInt(uniqueListName + "_size", 0);

        for (int i = 0; i < size; i++) {
            result.add(sharedPref.getString(uniqueListName + i, null));
        }
        return result;
    }
}

Wie zu verwenden:

SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferencesUtil.pushStringList(sharedPref, list, getString(R.string.list_name));
List<String> list = SharedPreferencesUtil.pullStringList(sharedPref, getString(R.string.list_name));

2voto

tmr Punkte 1450

Der folgende Code ist die akzeptierte Antwort, mit ein paar mehr Zeilen für neue Leute (mich), z.B. zeigt, wie man das Objekt vom Typ set zurück in arrayList konvertiert, und zusätzliche Anleitung, was vor '.putStringSet' und '.getStringSet' kommt. (danke evilone)

// shared preferences
   private SharedPreferences preferences;
   private SharedPreferences.Editor nsuserdefaults;

// setup persistent data
        preferences = this.getSharedPreferences("MyPreferences", MainActivity.MODE_PRIVATE);
        nsuserdefaults = preferences.edit();

        arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        //Retrieve followers from sharedPreferences
        Set<String> set = preferences.getStringSet("following", null);

        if (set == null) {
            // lazy instantiate array
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
        } else {
            // there is data from previous run
            arrayOfMemberUrlsUserIsFollowing = new ArrayList<>(set);
        }

// convert arraylist to set, and save arrayOfMemberUrlsUserIsFollowing to nsuserdefaults
                Set<String> set = new HashSet<String>();
                set.addAll(arrayOfMemberUrlsUserIsFollowing);
                nsuserdefaults.putStringSet("following", set);
                nsuserdefaults.commit();

2voto

Anshul Bansal Punkte 51

Der beste Weg, den ich in der Lage gewesen, zu finden ist ein machen ein 2D-Array von Tasten und setzen die benutzerdefinierten Elemente des Arrays in der 2D-Array von Tasten und dann rufen Sie es durch die 2D-Array beim Start. Ich mochte die Idee der Verwendung von String-Set nicht, weil die meisten Android-Benutzer noch auf Gingerbread sind und die Verwendung von String-Set erfordert Honeycomb.

Beispiel-Code: Hier ist ditor der gemeinsame Pref-Editor und rowitem ist mein benutzerdefiniertes Objekt.

editor.putString(genrealfeedkey[j][1], Rowitemslist.get(j).getname());
        editor.putString(genrealfeedkey[j][2], Rowitemslist.get(j).getdescription());
        editor.putString(genrealfeedkey[j][3], Rowitemslist.get(j).getlink());
        editor.putString(genrealfeedkey[j][4], Rowitemslist.get(j).getid());
        editor.putString(genrealfeedkey[j][5], Rowitemslist.get(j).getmessage());

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X