重新启动后列表重复(保存到SharedPreferences并获取它)

时间:2016-02-09 21:47:00

标签: android sharedpreferences

我有以下代码:

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

第三轮将重复。

1 个答案:

答案 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();
}