我有以下代码:
public final class SharedPreferencesTools {
private static final String USER_SETTINGS_PREFERENCES_NAME = "UserSettings";
private static final String ALL_ITEMS_LIST = "AllItemsList";
private static Gson gson = new GsonBuilder().create();
public static List<Item> getOrderedItems(Context context) {
String stringValue = getUserSettings(context).getString(ALL_ITEMS_LIST, "");
Type collectionType = new TypeToken<List<Item>>() {
}.getType();
List<Item> result = gson.fromJson(stringValue, collectionType);
return (result == null) ? new ArrayList<Item>() : result;
}
public static void setOrderedItems(Context context, List<Item> items) {
String stringValue = gson.toJson(items);
SharedPreferences sharedPreferences = getUserSettings(context);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(ALL_ITEMS_LIST, stringValue);
editor.apply();
}
static SharedPreferences getUserSettings(Context context) {
return context.getSharedPreferences(USER_SETTINGS_PREFERENCES_NAME, Context.MODE_PRIVATE);
}
}
问题在于,当我使用SharedPreferenceTools.getOrderetedItems(this)获取项目时,它返回正常列表,但是当我保存它时,它会保存列表并添加原始列表,例如:
List A(Original)包含Steve,Frank,Alex。
我打开了应用程序并将Frank的位置转换为Steve Position,并使用“setOrderedItems”保存它。
现在,重新打开应用程序并获得以下内容:
弗兰克,史蒂夫,亚历克斯(修改版)和史蒂夫,弗兰克,亚历克斯(原创),原版得到重复。我通过以下方式获取和设置:
List<Item> List = SharedPreferencesTools.getOrderedItems(this);
//List.add(new Item ...blabla)
SharedPreferencesTools.setOrderedItems(this, List );
return List ;
日志:
我添加了Log以获取Get和Set方法中“stringValue”的长度,这是日志:
首先运行:
设置:1084
获取:0
第二次运行:
设置:2167
获取:1084
第三轮将重复。
答案 0 :(得分:1)
修改: 清除列表,然后再进行设置。
替换:
List<Item> List = SharedPreferencesTools.getOrderedItems(this);
使用:
ArrayList<Item> List = new ArrayList<>();
您还应该避免将变量名称设置为List,因为它是List class的保留名称。
原始答案:
清除键值,然后使用editor.remove(String key)
保存。
实施例
使用setOrderedItems()
方法:
public static void setOrderedItems(Context context, List<Item> items) {
String stringValue = gson.toJson(items);
SharedPreferences sharedPreferences = getUserSettings(context);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove(ALL_ITEMS_LIST); //Clearing previous value
editor.putString(ALL_ITEMS_LIST, stringValue);
editor.apply();
}