Android ArrayList自定义对象-保存到SharedReferences-可序列化?

Android ArrayList自定义对象-保存到SharedReferences-可序列化?,android,arraylist,sharedpreferences,serializable,Android,Arraylist,Sharedpreferences,Serializable,我有一个对象的数组列表。该对象包含“位图”和“字符串”类型,然后只包含这两种类型的getter和setter。首先,位图是否可序列化 我将如何序列化它以将其存储在SharedReferences中?我见过很多人问过类似的问题,但似乎没有人给出一个好的答案。如果可能的话,我更喜欢一些代码示例 如果位图不可序列化,那么如何存储此ArrayList 非常感谢。是的,您可以在共享首选项中保存复合对象。比如说 Student mStudentObject = new Student(); Shared

我有一个对象的数组列表。该对象包含“位图”和“字符串”类型,然后只包含这两种类型的getter和setter。首先,位图是否可序列化

我将如何序列化它以将其存储在SharedReferences中?我见过很多人问过类似的问题,但似乎没有人给出一个好的答案。如果可能的话,我更喜欢一些代码示例

如果位图不可序列化,那么如何存储此ArrayList


非常感谢。

是的,您可以在共享首选项中保存复合对象。比如说

 Student mStudentObject = new Student();
 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Editor prefsEditor = appSharedPrefs.edit();
 Gson gson = new Gson();
 String json = gson.toJson(mStudentObject);
 prefsEditor.putString("MyObject", json);
 prefsEditor.commit(); 
…现在您可以检索对象,如下所示:

 SharedPreferences appSharedPrefs = PreferenceManager
             .getDefaultSharedPreferences(this.getApplicationContext());
 Gson gson = new Gson();
 String json = appSharedPrefs.getString("MyObject", "");
 Student mStudentObject = gson.fromJson(json, Student.class);
有关详细信息,请单击

如果您想获取任何类型对象(例如
Student
)的
ArrayList
,请使用:

Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);
Type Type=new-TypeToken(){}.getType();
List students=gson.fromJson(json,类型);

上述答案有效,但不适用于列表:

要保存对象列表,请执行以下操作:

List<Cars> cars= new ArrayList<Cars>();
    cars.add(a);
    cars.add(b);
    cars.add(c);
    cars.add(d);

    gson = new Gson();
    String jsonCars = gson.toJson(cars);
    Log.d("TAG","jsonCars = " + jsonCars);
List cars=new ArrayList();
加上(a);
加上(b);
加上(c);
加上(d);
gson=新的gson();
字符串jsonCars=gson.toJson(cars);
Log.d(“TAG”、“jsonCars=“+jsonCars”);
读取json对象:

Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);
Type Type=new-TypeToken(){}.getType();
List carsList=gson.fromJson(jsonCars,type);
保存:

public static void saveSharedPreferencesLogList(Context context, List<PhoneCallLog> callLog) {
    SharedPreferences mPrefs = context.getSharedPreferences(Constant.CALL_HISTORY_RC, context.MODE_PRIVATE);
    SharedPreferences.Editor prefsEditor = mPrefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(callLog);
    prefsEditor.putString("myJson", json);
    prefsEditor.commit();
}
public静态void saveSharedReferencesLogList(上下文,列表调用日志){
SharedReferences mPrefs=context.getSharedReferences(Constant.CALL\u HISTORY\u RC,context.MODE\u PRIVATE);
SharedReferences.Editor prefsEditor=mPrefs.edit();
Gson Gson=新的Gson();
字符串json=gson.toJson(callLog);
putString(“myJson”,json);
提交();
}
对于负载:

public static List<PhoneCallLog> loadSharedPreferencesLogList(Context context) {
    List<PhoneCallLog> callLog = new ArrayList<PhoneCallLog>();
    SharedPreferences mPrefs = context.getSharedPreferences(Constant.CALL_HISTORY_RC, context.MODE_PRIVATE);
    Gson gson = new Gson();
    String json = mPrefs.getString("myJson", "");
    if (json.isEmpty()) {
        callLog = new ArrayList<PhoneCallLog>();
    } else {
        Type type = new TypeToken<List<PhoneCallLog>>() {
        }.getType();
        callLog = gson.fromJson(json, type);
    }
    return callLog;
}
公共静态列表LoadSharedReferencesLogList(上下文){
List callLog=new ArrayList();
SharedReferences mPrefs=context.getSharedReferences(Constant.CALL\u HISTORY\u RC,context.MODE\u PRIVATE);
Gson Gson=新的Gson();
String json=mPrefs.getString(“myJson”,即“”);
if(json.isEmpty()){
callLog=newarraylist();
}否则{
Type Type=new-TypeToken(){
}.getType();
callLog=gson.fromJson(json,类型);
}
返回callLog;
}

PhoneCallLog是我的自定义对象的名称。(包含字符串、长值和布尔值)

对我来说,它是这样工作的:

将值放入SharedReferences中:

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = gson.toJson(ModelArrayList);

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();
Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());
String key=“key”;
ArrayList ModelArrayList=新的ArrayList();
共享参考资料;
SharedReferences.Editor;
shref=context.getSharedReferences(MyPREFERENCES,context.MODE\u PRIVATE);
Gson Gson=新的Gson();
字符串json=gson.toJson(ModelArrayList);
editor=shref.edit();
editor.remove(key.commit();
putString(key,json);
commit();
要从SharedReferences获取值,请执行以下操作:

String key = "Key";
ArrayList<ModelClass> ModelArrayList=new ArrayList();

SharedPreferences shref;
SharedPreferences.Editor editor;
shref = context.getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);

Gson gson = new Gson();
String json = gson.toJson(ModelArrayList);

editor = shref.edit();
editor.remove(key).commit();
editor.putString(key, json);
editor.commit();
Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response, 
    new TypeToken<List<ModelClass>>(){}.getType());
Gson-Gson=new-Gson();
字符串响应=shref.getString(键“”);
ArrayList lstArrayList=gson.fromJson(响应,
新的TypeToken(){}.getType());

Mete”上面的例子很有魅力。
下面是一个Kotlin示例

private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
    ?: error("err")
private val gson = Gson()
拯救

阅读

fun fetchArrayList():ArrayList{
val yourArrayList:ArrayList
val json=prefs.getString(“您的_键,”)
yourArrayList=when{
json.isNullOrEmpty()->ArrayList()
else->gson.fromJson(json,对象:TypeToken(){}.type)
}
返回您的ArrayList
}

kotlin实施了
Gson
,扩展了@SpyZips的答案

序列化为JSON

val jsonCars: String = Gson().toJson(cars);
反序列化以返回OBJ列表

val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
val type=object:TypeToken(){}.type
val carsList:List=Gson().fromJson(jsonCars,类型)

解决方案

不用担心,您可以按照我的代码进行操作。我使用自己的SharedReference自定义类来保存SharedReference中的任何类型的列表

公共类AuthPreference{
私有静态最终字符串MY\u PREFERENCES=“MY\u PREFERENCES”;
private static final int MODE=Context.MODE\u private;
私有静态身份验证首选项;
私人最终股份参考股份参考;
私人最终共享参考。编辑;
@SuppressLint(“提交引用”)
公共AuthPreference(上下文){
SharedReference=context.getSharedReferences(我的首选项,模式);
editor=SharedReference.edit();
}
公共空间清除(){
editor.clear().commit();
}
//这里保存api响应,就像保存模型arraylist一样
public void savedataresponse(ArrayList模型,字符串键){
SharedReferences.Editor=SharedReference.edit();
Gson Gson=新的Gson();
字符串json=gson.toJson(model);
putString(key,json);
editor.apply();
}
//在这里,我们得到了与模型arraylist类似的api响应。在需要定义时使用键值。
公共ArrayList GetDataResponse(字符串键){
Gson Gson=新的Gson();
String json=SharedReference.getString(key,null);
类型类型=新类型令牌(){
}.getType();
返回gson.fromJson(json,类型为_);
}
}

SharedReference的缺点是无法在其中存储对象,因此无法存储对象:(要序列化它,您可以使用。我不知道这对
SharedReferences
有什么帮助,因为您不能只在那里存储序列化的对象。也许您正在考虑一个
?是的,您可以保存。请检查我的答案。在将JSON数组名称存储到prefs中时,如何将其放入?您的意思是什么?请详细说明您的问题如果要保存文件,则代码不起作用ARRAYLIST@BhavikMetha,上面写的代码不是用于ArrayList的,上面的代码只是示例。如果您想获取任何对象e.d student类型的数组列表,那么us:type type=new-TypeToken(){}.getType();List students=gson.fromJson(jso