繁体   English   中英

Android保存一个ArrayList <Object> 作为SharedPreference

[英]Android saving an ArrayList<Object> as SharedPreference

我目前正在尝试将包含POJO的ArrayList保存为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();
}

这似乎不起作用。 当我调试它时,列表是空的。 如果我在没有加载/保存方法的情况下运行该应用程序,则该应用程序将按预期运行,但如您所见,列表不会保留在SharedPreferences中,因此当用户导航回我的活动时,该列表将不可用。

非常感谢您的任何帮助。

马库斯

您可以使用GSON库

您可以将ArrayList转换为字符串,然后存储为Preference,然后返回时,将该字符串转换为相同的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);

我在这里发现了问题:在onActivityResult之后调用了onPause,后者用一个空数组覆盖了我的数组。

抱歉,您在行中添加了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);
 }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM