Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 存储阵列列表<;定制类>;进入共享引用_Java_Android_Arraylist_Sharedpreferences - Fatal编程技术网

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);