保存并检索ArrayList到SharedPreferences

时间:2017-08-02 12:26:08

标签: java android arraylist sharedpreferences

这是我的保存程序代码,这会将得分,日期和玩家名称保存到排行榜:

mLeaderboardlist = new ArrayList<>();
   Leaderboardmodel s = new Leaderboardmodel();
   s.setDate("07/24/17");
   s.setName(player.getText().toString());
                    s.setScore(Integer.parseInt(String.valueOf(yourScore.getText())));
            Tab1Normal.mLeaderboardlist.add(s);
            SharedPreferences appSharedPrefs = PreferenceManager
                            .getDefaultSharedPreferences(getApplicationContext());
                    SharedPreferences.Editor prefsEditor = appSharedPrefs.edit();
                    Gson gson = new Gson();
                    String json = gson.toJson(s);
                    prefsEditor.putString("MyObject", json);
                    prefsEditor.apply();
                    prefsEditor.commit();

这是我在共享偏好中处理的检索程序代码:

 SharedPreferences appSharedPrefs = PreferenceManager
                .getDefaultSharedPreferences(this.getActivity().getApplicationContext());
        Gson gson = new Gson();
        String json = appSharedPrefs.getString("MyObject", "");
        Type type = new TypeToken<ArrayList<Leaderboardmodel>>(){}.getType();
        ArrayList<Leaderboardmodel> leaderboard= gson.fromJson(json, type);
            Collections.sort(leaderboard);
            adapter = new ListLeaderBoardAdapter(getActivity(), leaderboard);
            lvLeaderboardlist.setAdapter(adapter);

保存保存部分工作罚款,但检索部分显示错误并使应用程序崩溃,错误显示:

  

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY但在第1行第2行路径为BEGIN_OBJECT $

4 个答案:

答案 0 :(得分:0)

更改此行

Leaderboardmodel[] leaderboard= gson.fromJson(json, Leaderboardmodel[].class);

到这个

ArrayList<Leaderboardmodel > leaderboardmodels = new ArrayList<>();
leaderboardmodels.addAll(leaderboard);
Collections.sort(leaderboardmodels);

看看它是否有效。 我希望如此。

更新

您需要创建Leaderboardmodel的数组列表,然后调用sort。

val

答案 1 :(得分:0)

尝试调试加载的json,看看你是否真的得到了有效的json String。

也有类似的问题:Parsing generic ArrayList using GSON

答案 2 :(得分:0)

问题是你放了一个对象,而不是一个json。

 constructor(props) {
      super(props);
      this.state = {
          isLoading: true,
          PackageNo: '',
          PackageNoSeq: '',
          hasError: false,
          errorMessage: ''
      }
  }

您需要放置数组

Leaderboardmodel s = new Leaderboardmodel();
....
String json = gson.toJson(s);
prefsEditor.putString("MyObject", json);

答案 3 :(得分:0)

当你保存时,你保存的对象不是arraylist,

String json = gson.toJson(s);

这里是Leaderboardmodel的对象而不是Leaderboardmodel的arraylist

因此,当您检索时,将其检索为对象而不是数组列表,

Type type = new TypeToken<Leaderboardmodel>(){}.getType();
Leaderboardmodel leaderboard= gson.fromJson(json, type);