我有一个Listview,里面有一些String项。我试图将list的onStop()方法中的listview状态保存到SharedPreferences:
int i = 0;
HashSet resultsSet = new HashSet(resultAdapter.getCount());
while (i < resultAdapter.getCount()) {
resultsSet.add(resultAdapter.getItem(i)); i++;
}
editor.putStringSet("RSLTS", resultsSet);
editor.commit();
这是重新启动app后重新创建Listview状态的方法:
if (resultsSet != null) {
for (String result : resultsSet) { resultAdapter.insert(result, 0); }
}
如您所见,我在Listview的第一个位置(0)处插入每个新行。问题是Listview以某种奇怪的顺序重新创建,例如:
保存前的Listview: 3 ... | 2 ... | 1 ...
重新加载后的Listview:2 ... | 1 ... | 3 ...
不能弄明白。为什么会这样?有没有人知道它有什么问题?
答案 0 :(得分:2)
您正在使用 HashSet 并根据documentation:
此类实现Set接口,由哈希表(实际上是HashMap实例)支持。它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。该类允许null元素。
因此,您需要实现 TreeSet 或 LinkedHashSet 。 arraylist也是一个简单的选择。
答案 1 :(得分:0)
HashSet通常在没有定义顺序的情况下实现,因此无法保证订单在一段时间内或在写入字符串时保持不变。
因此,您的选择是:
1)如果适用于您的案例,请对您的字符串项进行排序(例如按字母顺序排列)
2)将您的数据保存为共享的pref,作为带有给定分隔符的连接字符串(您确定不会出现在您的数据中)。然后,当你回读它时,将你从共享pref获得的字符串与给定的分隔符分开,以获得原始字符串数组。