В настоящее время я пытаюсь сохранить 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 и, следовательно, будут недоступны, когда пользователь вернется к моей активности.
Любая помощь здесь очень ценится.
Маркус
3 ответа
Я обнаружил здесь проблему: onPause был вызван после onActivityResult, который перезаписал мой массив пустым массивом.
Вы можете использовать библиотеку 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);
Извините, но вы добавили 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);
}
}
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.