2017-08-02 130 views
0

這是我的救命程序代碼,這將節省比分,日期和玩家名字的排行榜:保存和檢索的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(); 

這是我的也是買賣sharedpreference的檢索程序代碼:

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但BEGIN_OBJECT位於第1行第2列路徑$

+0

您是否嘗試在'String json = appSharedPrefs.getString(「MyObject」,「」);'上放置一個斷點,以查看它存在於哪裏..? – AsfK

+0

我應該怎麼做先生? – Luffy

+0

檢查JSON與Android調試器聯繫(使用調試..)看到這個鏈接:https://developer.android.com/studio/debug/index.html – AsfK

回答

0

的問題是,你把一個對象,而不是一個JSON。

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

你需要把你的陣列

mLeaderboardlist = new ArrayList<>(); 
... 
String json = gson.toJson(mLeaderboardlist); 
+0

當我做這個先生,沒有項目顯示檢索部分 – Luffy

+0

你把數組,你得到數組。你把對象,你得到的對象。將對象添加到列表中。你把對象放在'Tab1Normal.mLeaderboardlist.add(s);',而不是'mLeaderboardlist.add(s);'。我不知道你在做什麼。 –

+0

如何檢索該先生? – Luffy

0

改變這一行

ArrayList<Leaderboardmodel> leaderboard= gson.fromJson(json, type); 

這個

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

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

更新:

您需要創建Leaderboardmodel數組列表,然後調用排序。

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

它不工作先生,其產生的錯誤 – Luffy

+0

我編輯我的答案你試過這個嗎? –

+0

是的先生,它產生一個錯誤 – Luffy

0

當你保存你要保存的對象ArrayList不是,

String json = gson.toJson(s); 

這裏s是Leaderboardmodel的對象,而不是ArrayList的Leaderboardmodel

所以,當你檢索,檢索它作爲對象而不是數組列表像,

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

thankyou先生.. – Luffy

+0

這是一個對象,而不是一個列表。 –