Я пытаюсь сохранить ArrayList
в SharedPreferences
, но получаю
ошибки, которые
java.lang.ClassCastException: java.util.ArrayList не может быть приведен к
com.example.host.myapplication.adapter.DataModel Вот мои примеры кода.
Это потому, что вы пытаетесь конвертировать DataModel в ArrayList.
Вам нужно изменить DataModel на простой pojo, например так:
public class DataModel {
public String name;
public boolean checked;
public DataModel(String name, boolean checked) {
this.name = name;
this.checked = checked;
}
}
Нет необходимости расширять ArrayList, поскольку ваша модель предназначена для одного элемента данных.
Затем вам нужно изменить методы saveArrayList и getArrayList для более удобочитаемых методов, таких как saveCategories
и getCategories()
, для следующих элементов:
private static final CATEGORIES_KEY = "CATEGORIES";
public void saveCategories(List<DataModel> list){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(CATEGORIES_KEY, json);
editor.apply();
}
public List<DataModel> getCategories(){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
List<Model> models;
Gson gson = new Gson();
String json = prefs.getString(CATEGORIES_KEY, null);
Type type = new TypeToken<List<DataModel>>() {}.getType();
try {
models = gson.fromJson(json, type);
} catch (IllegalStateException | JsonSyntaxException exception) {
// You need to catch the error here
Log.d("CONVERT", exception);
}
return models;
}
Вы видите, что клавиша изменяется как константа и перемещается внутри методов. Это потому, что нам нужно скрыть детали для вызывающего метода. Адаптер не должен знать детали.
Тогда вы можете использовать получить список категорий с:
adapter = new CustomCategoryAdapter(getCategories(), getApplicationContext());