Listview项目以错误的顺序重新创建

时间:2014-07-27 14:12:24

标签: android listview save

我有一个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 ...

不能弄明白。为什么会这样?有没有人知道它有什么问题?

2 个答案:

答案 0 :(得分:2)

您正在使用 HashSet 并根据documentation

  

此类实现Set接口,由哈希表(实际上是HashMap实例)支持。它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。该类允许null元素。

因此,您需要实现 TreeSet LinkedHashSet 。 arraylist也是一个简单的选择。

答案 1 :(得分:0)

HashSet通常在没有定义顺序的情况下实现,因此无法保证订单在一段时间内或在写入字符串时保持不变。

因此,您的选择是:

1)如果适用于您的案例,请对您的字符串项进行排序(例如按字母顺序排列)

2)将您的数据保存为共享的pref,作为带有给定分隔符的连接字符串(您确定不会出现在您的数据中)。然后,当你回读它时,将你从共享pref获得的字符串与给定的分隔符分开,以获得原始字符串数组。