【问题标题】:Android saving an ArrayList<Object> as SharedPreferenceAndroid 将 ArrayList<Object> 保存为 SharedPreference
【发布时间】:2014-09-26 15:56:08
【问题描述】:

我目前正在尝试将包含 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 中,因此当用户导航回我的活动时不可用。

非常感谢这里的任何帮助。

马库斯

【问题讨论】:

    标签: java android arraylist


    【解决方案1】:

    您可以使用GSON library

    您可以将您的 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);
    

    【讨论】:

    • 我真的很想在不使用外部库的情况下解决这个问题,但无论如何感谢您的回答
    • 这是jar文件,你只需要放到lib文件夹中。
    • 你有链接吗?我的搜索只返回不推荐使用的版本
    • 我今天放弃了,但明天会再试一次。可以加我Skype吗?马库斯雅康松
    【解决方案2】:

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

    【讨论】:

    • 哦,我没有使用onActivityResult来填数据,那很棘手:)
    • 感谢您的努力
    【解决方案3】:

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

    【讨论】:

    • 这很奇怪。当我运行它时它甚至不会循环
    • @Marcus 我说代码工作正常,因为我在应用程序中检查了它。您可以做其他事情,只需在控制台中打印您保存的内容和加载的内容。我也做了同样的事情。
    • 它对你有用很奇怪。看看我的回答,这就是问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    • 2014-05-09
    • 2015-06-21
    • 2019-05-24
    • 2014-01-17
    • 2021-09-15
    相关资源
    最近更新 更多