Проблема с сохранением arrayList в SharedPreferences - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь сохранить ArrayList в SharedPreferences, но я получаю ошибки,

java.lang.ClassCastException: java.util.ArrayList не может быть приведен к

com.example.host.myapplication.adapter.DataModel Вот мои примеры кода.

DataModel.java

public class DataModel extends ArrayList<String> {

    public String name;
    public boolean checked;

    public DataModel(String name, boolean checked) {
        this.name = name;
        this.checked = checked;
    }
}

PickCategoryActivity

//...
 adapter = new CustomCategoryAdapter(getArrayList("CATEGORY"), getApplicationContext());
//... 
public void saveArrayList(ArrayList<DataModel> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply(); 
}

public ArrayList<DataModel> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<DataModel>>() {}.getType();
    return gson.fromJson(json, type);
}

CustomCategoryAdapter.java

private ArrayList dataSet;
    Context mContext;

    // View lookup cache
    private static class ViewHolder {
        TextView txtName;
        CheckBox checkBox;
    }

    public CustomCategoryAdapter(ArrayList<DataModel> data, Context context) {
        super(context, R.layout.activity_pick_category_row_list, data);
        this.dataSet = data;
        this.mContext = context;

    }

    @Override
    public DataModel getItem(int position) {
        return (DataModel) dataSet.get(position); // i get an error here
    }
//...

Ошибка logcat:

java.lang.ClassCastException: java.util.ArrayList нельзя привести к com.example.host.myapplication.adapter.DataModel в com.example.host.myapplication.adapter.CustomCategoryAdapter.getItem (CustomCategoryAdapter.java:45) в com.example.host.myapplication.adapter.CustomCategoryAdapter.getView (CustomCategoryAdapter.java:69)

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Проблема в вашем CustomCategoryAdapter

Вы объявили dataSet как ArrayList, но в качестве аргумента конструктора CustomCategoryAdapter указано ArrayList<DataModel>

Используйте это

ArrayList<DataModel> dataSet

Вместо этого

private ArrayList dataSet;
0 голосов
/ 04 сентября 2018

Я пытаюсь сохранить 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());
0 голосов
/ 04 сентября 2018
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext()); 
String json = new Gson().toJson(yourlist);
prefs .edit().putString("testArray",json).commit();

try commit (); который синхронно записывает свои настройки в постоянное хранилище

...