2014-09-26 78 views
0

我正在嘗試將包含POJO的ArrayList保存爲SharedPreference,以便在用戶重新輸入應用程序時檢索它,但似乎不起作用。Android將ArrayList <Object>保存爲SharedPreference

這是我做的:

回調方法

ArrayList<myObject> myList; 
ArrayList<Boolean> myobject_repeat; 
MyListAdapter adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.myview); 
    lw = (ListView) findViewById(R.id.lw); 
    myList= new ArrayList<myObject>(); 
    myobject_repeat = new ArrayList<Boolean>(); 
    adapter = new MyListAdapter(this, myList); 
    lw.setAdapter(adapter); 
} 

@Override 
protected void onPause() { 
    saveArray(); 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    loadArray(this); 
    super.onResume(); 
} 

的方式來保存/載入陣列

public boolean saveArray() { 
    SharedPreferences pref = PreferenceManager 
      .getDefaultSharedPreferences(this); 
    SharedPreferences.Editor edit = pref.edit(); 
    edit.putInt("list_size", myList.size()); 

    for (int i = 0; i < myList.size(); i++) { 
     edit.remove("id" + i); 
     edit.remove("repeat" + i); 
     edit.putLong("id" + i, myList.get(i).getId()); 
     edit.putBoolean("repeat" + i, myList.get(i).isRepeat()); 
    } 

    return edit.commit(); 
} 

public void loadArray(Context c) { 
    SharedPreferences pref = PreferenceManager 
      .getDefaultSharedPreferences(c); 
    myList.clear(); 
    myList2.clear(); 
    int listsize = pref.getInt("list_size", 0); 

    for (int i = 0; i < listsize; i++) { 
     MyObject tmpObject = new MyObject(); 
     tmpObject.setId(pref.getLong("id" + i, 0)); 
     tmpObject.setRepeat(pref.getBoolean("repeat" + i, false)); 
     myList.add(tmpObject); 
    } 

} 

這是我對象添加到陣列

@Override 
protected void onActivityResult(int requestCode, int resultCode, 
     Intent result) { 
    super.onActivityResult(requestCode, resultCode, result); 

    if (resultCode == RESULT_OK) { 
     int hour = result.getExtras().getInt("hour"); 
     int minute = result.getExtras().getInt("minute"); 
     boolean repeat = result.getExtras().getBoolean("repeat"); 
     setUpObject(hour, minute, repeat); 
    } 
} 

private void setUpObject(int hour, int minute, boolean repeat) { 

    //Doing magic tricks 

    MyObject tmpObject= new MyObject(); 
    tmpObject.setHours(hour); 
    tmpObject.setMinutes(minute); 
    tmpObject.setRepeat(repeat); 
    tmpObject.setId(timeInMs); 

    myList.add(tmpObject); 
    adapter.remove(tmpObject); 
    adapter.add(tmpObject); 
    adapter.notifyDataSetChanged(); 
} 

T他似乎沒有工作。當我調試它時,列表是空的。如果我在沒有加載/保存方法的情況下運行該應用程序,它將按預期工作,但正如您所看到的,這些列表不會在SharedPreferences中保留,因此在用戶導航返回到我的活動時不可用。

這裏的任何幫助真的很感激。

馬庫斯

回答

1

我在這裏發現了問題:在onPause是onActivityResult其覆蓋我的陣列空數組後調用。

+0

哦,我沒有使用onActivityResult來填寫數據,這很棘手:) – sotcha 2014-09-27 11:24:02

+0

感謝您的努力tho – Marcus 2014-09-27 11:40:47

3

您可以使用GSON library

你可以將你的ArrayList轉換爲字符串並存儲到首選項,當你回來將該字符串轉換爲相同的ArrayList。

//-- code to convert list to string using Gson 
    Type listType = new TypeToken<List<myObject>>() {}.getType(); 
    Gson gson = new Gson(); 
    String json = gson.toJson(target, listType); 
    // store this string to shared preference 


    //-- code to convert this string to list 
    String json = gson.toJson(target, listType); 
    List<String> target2 = gson.fromJson(json, listType); 
+0

我真的想解決這個問題,而不使用外部庫,但無論如何感謝您的回答 – Marcus 2014-09-26 16:06:00

+0

它是jar文件,你只需要把它放到lib文件夾中。 – Jatin 2014-09-26 16:06:50

+0

你有鏈接嗎?我的搜索僅返回已棄用的版本 – Marcus 2014-09-26 16:07:21

0

很抱歉,但你的行添加tmpAlarm

myList.add(tmpAlarm);

它應該是

myList.add(tmpObject);

public void loadArray(Context c) { 
    SharedPreferences pref = PreferenceManager 
     .getDefaultSharedPreferences(c); 
    myList.clear(); 
    myList2.clear(); 
    int listsize = pref.getInt("list_size", 0); 

    for (int i = 0; i < listsize; i++) { 
    MyObject tmpObject = new MyObject(); 
    tmpObject.setId(pref.getLong("id" + i, 0)); 
    tmpObject.setRepeat(pref.getBoolean("repeat" + i, false)); 
    myList.add(tmpAlarm); 
} 
} 
+0

對不起,這是一個錯字 – Marcus 2014-09-26 17:15:43

+0

無法打印錯誤的代碼工作正常!也許你有另一個bug – sotcha 2014-09-26 17:34:54

+0

這很奇怪。當我運行它甚至不會循環 – Marcus 2014-09-26 21:23:17