将Android的SharedPreferences转换成ArrayList

3

我创建了一个简单的游戏。在结束时,用户的姓名和分数应该进入高分榜。为此,我想将这些数据存储在sharedpreferences中。我看到了一篇帖子,并试图将其应用于我的应用程序,但它强制关闭了。我甚至不知道我是否做对了。因此,我将这些键值对(玩家,分数)放入了一个arraylist中。从那里,我可以将值取出并放入listview中。 这只是一个示例。

SharedPreferences.Editor scoreEditor = myScores.edit();
        scoreEditor.putString("PLAYER", "Thomas");
        scoreEditor.putString("SCORE", "5");
        scoreEditor.commit();


        final ArrayList<HashMap<String,String>> LIST = new ArrayList<HashMap<String,String>>();
        Map<String, ?> items = myScores.getAll();

        for(String s : items.keySet()){
            HashMap<String,String> hmap = new HashMap<String,String>();
            hmap.put("PLAYER", s);
            hmap.put("SCORE", items.get(s).toString());

            LIST.add(hmap);
        }

        Toast.makeText(Start.this, "LIST size: "+LIST.size(), Toast.LENGTH_LONG).show();

对于我来说,如果我像这样存储这些数据也是可以的:

scoreEditor.putString("DATA", "Thomas" + "-" + "5");

并将其放入ArrayList<String> LIST = new ArrayList<String>();中。

但我不知道该怎么做。

你们能帮我吗?

编辑:正如Haphazard所建议的,我可以采取另一种方法。我编写了这段代码,但我不知道这是否是正确的方法。由于sharedpreferences存在问题,我还在尝试解决它,因此还没有进行测试。

SharedPreferences.Editor scoreEditor = myScores.edit();
scoreEditor.putString("DATA", "Thomas" + "-" + "5");
scoreEditor.commit();


HashSet<String> hset=new HashSet<String>();
hset.addAll((Collection<? extends String>) myScores.getAll());

ArrayList<String> LIST = new ArrayList<String>(hset);

当你遇到强制关闭时,应首先查看logcat并查看问题所在以及导致强制关闭的异常类型。 - Snicolas
1个回答

3
SharedPreferences编辑器不接受列表,但它接受集合。您可以将列表转换为HashSet或类似的东西,并将其存储在那里。当您读取它时,将其转换为ArrayList,如果需要排序,就可以使用它了。
请注意,集合必须是字符串集合,因此您必须坚持使用"Thomas" + "-" + "5"设置。
编辑:针对您的新更新,我想更多地考虑以下内容:
//Retrieve the values
Set<String> set = new HashSet<String>();
set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();

那段代码未经测试,但应该可以运行。

编辑:如果您的API级别低于get/setStringSet()级别,则可以尝试以下操作:

1)将您的高分列表转换为一个分隔符字符串。也就是说,如果您有["Tom, 1", "Ed, 5"],则可以循环遍历并将其转换为像"Tom, 1|Ed, 5"这样的字符串。您可以使用setString(..)轻松存储它。

2)当您想要读取值时,请执行getString(..),然后使用String.split("|")来获取原始列表。好吧,它返回一个数组,但可以很容易地将其转换为列表。


我现在已经更新了。很抱歉,SharedPreferences部分导致了强制关闭,我正在努力找出原因。 - erdomester
  1. 如何获取现有分数列表?
  2. getStringSet和putStringSet似乎不受支持。我知道它在这里(http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#putStringSet(java.lang.String, java.util.Set<java.lang.String>)),但Eclipse无法识别它们。可能是因为我正在API lvl 11(7)下编程。
- erdomester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接