size = 3 matrix_surprise = [[0] * size] * size matrix = [[0]*size for i in range(size)]
[/g1]
Эта «проблема» документирована на SharedPreferences.getStringSet
.
SharedPreferences.getStringSet
возвращает ссылку на сохраненный объект HashSet внутри SharedPreferences
. Когда вы добавляете элементы к этому объекту, они фактически добавляются внутри SharedPreferences
.
Это нормально, но проблема возникает, когда вы пытаетесь его сохранить: Android сравнивает модифицированный HashSet, который вы пытаетесь для сохранения с помощью SharedPreferences.Editor.putStringSet
с текущим, сохраненным на SharedPreference
, и оба являются одним и тем же объектом !!!
Возможное решение состоит в том, чтобы сделать копию Set<String>
, возвращенную SharedPreferences
:
Set<String> s = new HashSet<String>(sharedPrefs.getStringSet("key", new HashSet<String>()));
Это делает s
другим объектом, а строки, добавленные в s
, не будут добавлены в набор, сохраненный внутри SharedPreferences
.
Другим обходным решением, которое будет работать, является использование одной и той же транзакции SharedPreferences.Editor
для хранения другого более простого предпочтения (например, целочисленного или логического), единственное, что вам нужно, это заставить, чтобы хранимое значение отличалось для каждой транзакции (например, вы можете сохранить размер набора строк).
Это поведение задокументировано так:
from getStringSet:
"Обратите внимание, что вы не должны изменять экземпляр набора, возвращенный этим вызовом. сохраненных данных не гарантируется, если вы это сделаете, и ваша способность вообще не изменять этот экземпляр. "
blockquote>И это кажется вполне разумным, особенно если оно задокументировано в API, иначе это API должен будет копировать каждый доступ. Поэтому причиной этого дизайна была, пожалуй, производительность. Я полагаю, что они должны заставить эту функцию возвращать результат, завернутый в немодифицируемый экземпляр класса, но это снова требует выделения.
Ищет решение для одной и той же проблемы, разрешил его:
1) Извлеките существующий набор из общих настроек
2) Сделайте копию
3) Обновить копию
4) Сохранить копию
SharedPreferences.Editor editor = sharedPrefs.edit();
Set<String> oldSet = sharedPrefs.getStringSet("key", new HashSet<String>());
//make a copy, update it and save it
Set<String> newStrSet = new HashSet<String>();
newStrSet.add(new_element);
newStrSet.addAll(oldSet);
editor.putStringSet("key",newStrSet); edit.commit();
Я пробовал все вышеперечисленные ответы, никто не работал для меня. Поэтому перед добавлением нового элемента в список старого общего pref, я сделал следующие шаги
public static void addCalcsToSharedPrefSet(Context ctx,Set<String> favoriteCalcList) {
ctx.getSharedPreferences(FAV_PREFERENCES, 0).edit().clear().commit();
SharedPreferences sharedpreferences = ctx.getSharedPreferences(FAV_PREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putStringSet(FAV_CALC_NAME, favoriteCalcList);
editor.apply(); }
Я столкнулся с проблемой, когда значения не были постоянными, если я снова открываю приложение после очистки приложения из фона, был показан только первый элемент, добавленный в список.