2014-09-26 77 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