В настоящее время я пытаюсь сохранить ArrayList, содержащий POJO, в качестве 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 и, следовательно, будут недоступны, когда пользователь вернется к моей активности.

Любая помощь здесь очень ценится.

Маркус

0
Marcus 26 Сен 2014 в 19:56

3 ответа

Лучший ответ

Я обнаружил здесь проблему: onPause был вызван после onActivityResult, который перезаписал мой массив пустым массивом.

1
Marcus 27 Сен 2014 в 14:15
О, я не использовал onActivityResult для заполнения данных, это было сложно :)
 – 
sotcha
27 Сен 2014 в 15:24
Спасибо за ваши усилия
 – 
Marcus
27 Сен 2014 в 15:40

Вы можете использовать библиотеку 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);
3
drew moore 26 Сен 2014 в 20:56
Я действительно хочу решить эту проблему без использования внешней библиотеки, но все равно спасибо за ответ.
 – 
Marcus
26 Сен 2014 в 20:06
Это файл jar, который вам просто нужно поместить в папку lib.
 – 
Jatin
26 Сен 2014 в 20:06
У вас есть ссылка? мой поиск возвращает только устаревшую версию
 – 
Marcus
26 Сен 2014 в 20:07
 – 
Marcus
26 Сен 2014 в 20:24
Я сдаюсь на сегодня, но попробую еще раз завтра. Можешь добавить меня в скайп? Маркуссяконссон
 – 
Marcus
26 Сен 2014 в 21:03

Извините, но вы добавили 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
sotcha 26 Сен 2014 в 21:14
Это очень странно. Когда я запускаю его, он даже не зацикливается
 – 
Marcus
27 Сен 2014 в 01:23
Я говорю, что код работает нормально, потому что я проверил его в приложении. Вы можете сделать что-то еще, просто напечатать в консоли, что вы сохраняете, а что загружаете. Я сделал то же самое и работает.
 – 
sotcha
27 Сен 2014 в 03:42
Очень странно, что это сработало для вас. Посмотрите на мой ответ, это была проблема
 – 
Marcus
27 Сен 2014 в 14:30