Android 从 SharedPrefs 获取集合破坏了顺序
Android Getting a Set from SharedPrefs is corrupting the order
我有这样的方法:
public static void setSearchHistory(Activity activity, int channelId) {
SharedPreferences sp = getSharedPreferences(activity);
SharedPreferences.Editor prefsEditor = sp.edit();
Set<String> searchHistory = sp.getStringSet("searchHistory", new LinkedHashSet<String>());
List<String> shList = new ArrayList<>();
shList.addAll(searchHistory);
if(shList.size() > 0) {
boolean wasAdded = false;
for(int i=0;i<shList.size();i++) {
Integer channelID = Integer.parseInt(shList.get(i));
if(channelId == channelID) {
shList.remove(i);
shList.add(0, String.valueOf(channelId));
wasAdded = true;
break;
}
}
if(!wasAdded) {
shList.add(0, String.valueOf(channelId));
}
} else {
shList.add(String.valueOf(channelId));
}
if(shList.size() > 10) {
for(int i=10;i<shList.size();i++) {
shList.remove(i);
}
}
searchHistory = new LinkedHashSet<>(shList);
prefsEditor.putStringSet("searchHistory", searchHistory);
prefsEditor.apply();
}
此方法确实获取了 channelId
参数并将其添加到 Set
的第一个位置并保存回 SharedPreferences
。它还控制 channelId
是否已在列表中。如果是这样,它将 channelId
从当前位置删除并将其添加到第一个位置。然后它删除最后的项目,直到它的大小为 10。
我把List
放回Set
,列表的顺序是对的。我也给他们截图了:
List
后的Set
加进去:
但是当我像下面这样从 SharedPreferences
得到 Set
时,列表的顺序非常随机。
SharedPreferences sp = getSharedPreferences(activity);
Set<String> searchHistory = sp.getStringSet("searchHistory", new LinkedHashSet<String>());
List<String> shList = new ArrayList<>();
shList.addAll(searchHistory);
保存到SharedPreferences
后的Set
:
这真烦人,我不希望它打乱顺序。 :(
如有任何帮助,我们将不胜感激。谢谢。
我从另一个问题中找到了解决方法:here
我完全删除了 Set
对象并将它们替换为 JSONArray
保存到 SharedPrefs 中 String
如下;
将 List
放入 SharedPrefs:
public static void setSearchHistory(Activity activity, int channelId) {
try {
SharedPreferences sp = getSharedPreferences(activity);
SharedPreferences.Editor prefsEditor = sp.edit();
JSONArray searchHistory;
List<String> shList = new ArrayList<>();
if(sp.getString("searchHistory", null) != null) {
searchHistory = new JSONArray(sp.getString("searchHistory", null));
for(int i=0;i<searchHistory.length();i++) {
shList.add(searchHistory.get(i).toString());
}
}
if(shList.size() > 0) {
boolean wasAdded = false;
for(int i=0;i<shList.size();i++) {
Integer channelID = Integer.parseInt(shList.get(i));
if(channelId == channelID) {
shList.remove(i);
shList.add(0, String.valueOf(channelId));
wasAdded = true;
break;
}
}
if(!wasAdded) {
shList.add(0, String.valueOf(channelId));
}
} else {
shList.add(String.valueOf(channelId));
}
if(shList.size() > 10) {
for(int i=10;i<shList.size();i++) {
shList.remove(i);
}
}
searchHistory = new JSONArray(shList);
prefsEditor.putString("searchHistory", searchHistory.toString());
prefsEditor.apply();
} catch (JSONException e) {
e.printStackTrace();
}
}
并从 SharedPrefs 获取 List
:
public static List<Channel> getSearchHistory(Activity activity) {
try {
SharedPreferences sp = getSharedPreferences(activity);
List<String> shList = new ArrayList<>();
if(sp.getString("searchHistory", null) != null) {
JSONArray searchHistory = new JSONArray(sp.getString("searchHistory", null));
for(int i=0;i<searchHistory.length();i++) {
shList.add(searchHistory.get(i).toString());
}
}
List<Channel> channelList = new ArrayList<>();
for(int i=0;i<shList.size();i++) {
Channel channel = Channel.findChannelByID(Integer.parseInt(shList.get(i)), activity);
channelList.add(channel);
}
return channelList;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
很有魅力。耶!
我有这样的方法:
public static void setSearchHistory(Activity activity, int channelId) {
SharedPreferences sp = getSharedPreferences(activity);
SharedPreferences.Editor prefsEditor = sp.edit();
Set<String> searchHistory = sp.getStringSet("searchHistory", new LinkedHashSet<String>());
List<String> shList = new ArrayList<>();
shList.addAll(searchHistory);
if(shList.size() > 0) {
boolean wasAdded = false;
for(int i=0;i<shList.size();i++) {
Integer channelID = Integer.parseInt(shList.get(i));
if(channelId == channelID) {
shList.remove(i);
shList.add(0, String.valueOf(channelId));
wasAdded = true;
break;
}
}
if(!wasAdded) {
shList.add(0, String.valueOf(channelId));
}
} else {
shList.add(String.valueOf(channelId));
}
if(shList.size() > 10) {
for(int i=10;i<shList.size();i++) {
shList.remove(i);
}
}
searchHistory = new LinkedHashSet<>(shList);
prefsEditor.putStringSet("searchHistory", searchHistory);
prefsEditor.apply();
}
此方法确实获取了 channelId
参数并将其添加到 Set
的第一个位置并保存回 SharedPreferences
。它还控制 channelId
是否已在列表中。如果是这样,它将 channelId
从当前位置删除并将其添加到第一个位置。然后它删除最后的项目,直到它的大小为 10。
我把List
放回Set
,列表的顺序是对的。我也给他们截图了:
List
后的Set
加进去:
但是当我像下面这样从 SharedPreferences
得到 Set
时,列表的顺序非常随机。
SharedPreferences sp = getSharedPreferences(activity);
Set<String> searchHistory = sp.getStringSet("searchHistory", new LinkedHashSet<String>());
List<String> shList = new ArrayList<>();
shList.addAll(searchHistory);
保存到SharedPreferences
后的Set
:
这真烦人,我不希望它打乱顺序。 :(
如有任何帮助,我们将不胜感激。谢谢。
我从另一个问题中找到了解决方法:here
我完全删除了 Set
对象并将它们替换为 JSONArray
保存到 SharedPrefs 中 String
如下;
将 List
放入 SharedPrefs:
public static void setSearchHistory(Activity activity, int channelId) {
try {
SharedPreferences sp = getSharedPreferences(activity);
SharedPreferences.Editor prefsEditor = sp.edit();
JSONArray searchHistory;
List<String> shList = new ArrayList<>();
if(sp.getString("searchHistory", null) != null) {
searchHistory = new JSONArray(sp.getString("searchHistory", null));
for(int i=0;i<searchHistory.length();i++) {
shList.add(searchHistory.get(i).toString());
}
}
if(shList.size() > 0) {
boolean wasAdded = false;
for(int i=0;i<shList.size();i++) {
Integer channelID = Integer.parseInt(shList.get(i));
if(channelId == channelID) {
shList.remove(i);
shList.add(0, String.valueOf(channelId));
wasAdded = true;
break;
}
}
if(!wasAdded) {
shList.add(0, String.valueOf(channelId));
}
} else {
shList.add(String.valueOf(channelId));
}
if(shList.size() > 10) {
for(int i=10;i<shList.size();i++) {
shList.remove(i);
}
}
searchHistory = new JSONArray(shList);
prefsEditor.putString("searchHistory", searchHistory.toString());
prefsEditor.apply();
} catch (JSONException e) {
e.printStackTrace();
}
}
并从 SharedPrefs 获取 List
:
public static List<Channel> getSearchHistory(Activity activity) {
try {
SharedPreferences sp = getSharedPreferences(activity);
List<String> shList = new ArrayList<>();
if(sp.getString("searchHistory", null) != null) {
JSONArray searchHistory = new JSONArray(sp.getString("searchHistory", null));
for(int i=0;i<searchHistory.length();i++) {
shList.add(searchHistory.get(i).toString());
}
}
List<Channel> channelList = new ArrayList<>();
for(int i=0;i<shList.size();i++) {
Channel channel = Channel.findChannelByID(Integer.parseInt(shList.get(i)), activity);
channelList.add(channel);
}
return channelList;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
很有魅力。耶!