Java 存储阵列列表<;定制类>;进入共享引用
我有一个自定义类任务的Java 存储阵列列表<;定制类>;进入共享引用,java,android,arraylist,sharedpreferences,Java,Android,Arraylist,Sharedpreferences,我有一个自定义类任务的ArrayList public class Task { String name,desc; Date date; Context context; public Task(String name, String desc, Date date, Context context) { this.name = name; this.desc = desc; this.date = date;
ArrayList
public class Task {
String name,desc;
Date date;
Context context;
public Task(String name, String desc, Date date, Context context) {
this.name = name;
this.desc = desc;
this.date = date;
this.context = context;
}
}
我想把它保存在SharedReferences中。。我读到可以通过将其转换为Set来实现。。但是我不知道怎么做
有办法做到这一点吗?或者以任何其他方式存储数据而不是共享数据引用
谢谢:)
编辑:
按原样存储自定义对象的整个ArrayList以共享数据引用
我们无法将ArrayList
或任何其他对象直接存储到SharedReferences
对于同样的问题,有一个解决办法。我们可以使用GSON
库进行同样的操作
使用此库,我们可以将对象转换为JSON字符串
,然后将其存储在SharedReferences
中,然后检索JSON字符串并将其转换回对象
但是,如果要保存自定义类的ArrayList
,则必须执行以下操作:
定义类型
Type listOfObjects = new TypeToken<List<CUSTOM_CLASS>>(){}.getType();
Type listOfObjects=new-TypeToken(){}.getType();
然后将其转换为字符串并保存到共享首选项中
String strObject = gson.toJson(list, listOfObjects); // Here list is your List<CUSTOM_CLASS> object
SharedPreferences myPrefs = getSharedPreferences(YOUR_PREFS_NAME, Context.MODE_PRIVATE);
Editor prefsEditor = myPrefs.edit();
prefsEditor.putString("MyList", strObject);
prefsEditor.commit();
String strObject=gson.toJson(list,listofoobjects);//这是您的列表对象
SharedReferences myPrefs=GetSharedReferences(您的\u PREFS\u名称,Context.MODE\u PRIVATE);
编辑器prefsEditor=myPrefs.edit();
putString(“MyList”,strObject);
提交();
检索字符串并将其转换回Object
String json = myPrefs.getString("MyList", "");
List<CUSTOM_CLASS> list2 = gson.fromJson(json, listOfObjects);
stringjson=myPrefs.getString(“MyList”,“MyList”);
list2=gson.fromJson(json,listOfObjects);
如果顺序不重要,您可以使用
ArrayList arrayList = new ArrayList();
...
Set set = new HashSet(arrayList);
将列表转换为集合。然后可以将集合保存在SharedReferences中
编辑:好的,似乎只对字符串列表有效。您不能确定是否保存上下文对象,保存它没有意义。我的建议是重写toString
,以返回一个JSONObject,该JSONObject包含要存储在SharedReference中的信息
public String toString() {
JSONObject obj = new JSONObject();
try {
obj.put("name", name);
obj.put("desc", desc);
obj.put("date", date.getTime());
catch (JSONException e) {
Log.e(getClass().getSimpleName(), e.toString());
}
return obj.toString();
}
并在SharedReference中写入此json对象。回读时,您必须解析并构造任务
对象共享引用支持一组字符串,但这并不能解决您的问题。
如果需要存储自定义对象,可以将它们序列化为字符串并再次反序列化。
但这不适用于您的上下文变量-我不会存储它,因为它是临时设计的。
您还可以让您的类实现可序列化,将其写入文件,然后将该文件的路径存储在首选项中。使用ObjectMapper,您可以这样做。请看下面的代码
public List<CustomClass> getCustomClass() {
List<Map<String, Object>> mapList = new ArrayList<Map<String, Object>>();
ObjectMapper objectMapper = new ObjectMapper();
String value = getString(CUSTOM_CLASS, null);
if (null != value) {
try {
mapList = objectMapper.readValue(value, List.class);
} catch (IOException e) {
e.printStackTrace();
}
}
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("cutoms", mapList);
return dataMap
}
公共列表getCustomClass(){
List mapList=new ArrayList();
ObjectMapper ObjectMapper=新的ObjectMapper();
字符串值=getString(自定义类,空);
if(null!=值){
试一试{
mapList=objectMapper.readValue(值,List.class);
}捕获(IOE异常){
e、 printStackTrace();
}
}
Map dataMap=newhashmap();
dataMap.put(“cutoms”,mapList);
返回数据映射
}
您需要解析dataMap并获取值和
public void setCutomClass(List<CustomClass> cutoms) {
ObjectMapper objectMapper = new ObjectMapper();
String value = null;
try {
value = objectMapper.writeValueAsString(cutoms);
} catch (IOException e) {
e.printStackTrace();
}
setString(CUSTOM_CLASS, value);
}
public void setCutomClass(列表cutoms){
ObjectMapper ObjectMapper=新的ObjectMapper();
字符串值=null;
试一试{
值=objectMapper.writeValueAsString(cutoms);
}捕获(IOE异常){
e、 printStackTrace();
}
设置字符串(自定义类、值);
}
希望以上代码能帮助你 您应该能够使用putParcelableArrayList()将其传入 还可以将数组存储为全局应用程序值
必须使用arraylist作为属性创建一个类,如下所示:
public class MyApplication extends Application {
private ArrayList<Task> someVariable;
public ArrayList<Task> getSomeVariable() {
return someVariable;
}
public void setSomeVariable(ArrayList<Task> someVariable) {
this.someVariable = someVariable;
}
}
<application android:name="MyApplication" android:icon="@drawable/icon" android:label="@string/app_name">
上述关于共享偏好的建议也应该有效
希望这有帮助。将Arraylist值存储到SharedReference中
保存:
SharedPreferences SelectedId = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = SelectedId.edit();
editor.putString("DeviceToken", TextUtils.join(",", limits)); // Add Array list elements to shared preferences
editor.commit();
Toast.makeText(getApplicationContext(), "Dash_Agil" + t, Toast.LENGTH_SHORT).show();
获取:
SharedPreferences tt = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
String ss = tt.getString("DeviceToken", "");
List<String> list1 = new LinkedList (Arrays.asList(TextUtils.split(ss, ",")));
Toast.makeText(getApplicationContext(),""+list1, Toast.LENGTH_SHORT).show();
TextView t = (TextView) findViewById(R.id.list_items_id);
t.setText(ss);
SharedReferences tt=GetSharedReferences(MyPREFERENCES,Context.MODE\u PRIVATE);
String ss=tt.getString(“DeviceToken”,即“”);
List list1=新的LinkedList(Arrays.asList(TextUtils.split(ss,“,”));
Toast.makeText(getApplicationContext(),“”+list1,Toast.LENGTH\u SHORT.show();
TextView t=(TextView)findViewById(R.id.list\u items\u id);
t、 setText(ss);
我尝试过这个,但当我记录strObject时,它是“[]”。。虽然arraylist不是empty@MuhammadAshraf第一件事是,您首先尝试从SharedPref检索值(甚至在保存它们之前),第二件事不是将整个列表保存到SharedPref,而是保存第一个对象s=gson.toJson(tasks.get(0),Task.class)代码>并确保调用了editPrefs.commit()
My fault,我添加了错误的代码,我编辑了它。。这就是不需要的代码work@MuhammadAshraf在这行s=gson.toJson(tasks,Task.class)代码>将任务类更改为对象列表
SharedPreferences SelectedId = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = SelectedId.edit();
editor.putString("DeviceToken", TextUtils.join(",", limits)); // Add Array list elements to shared preferences
editor.commit();
Toast.makeText(getApplicationContext(), "Dash_Agil" + t, Toast.LENGTH_SHORT).show();
SharedPreferences tt = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
String ss = tt.getString("DeviceToken", "");
List<String> list1 = new LinkedList (Arrays.asList(TextUtils.split(ss, ",")));
Toast.makeText(getApplicationContext(),""+list1, Toast.LENGTH_SHORT).show();
TextView t = (TextView) findViewById(R.id.list_items_id);
t.setText(ss);