自定义对象的 ArrayList 不使用 GSON 保存到 SharedPreferences
ArrayList of custom objects not saving to SharedPreferences with GSON
我有一个 ArrayList
的自定义 POJO
对象,我想将它们保存到 SharedPreferences
中,这样它们就不会被垃圾回收,并且用户在应用程序后仍然可以访问它们已关闭。
我试过使用 GSON
,但我认为我缺少一些我不能 see.The String
我的 Object
已转换为已保存正确但没有存储任何内容。
我正在使用这个 Click event
来存储:
cartBut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
SharedPreferences mPrefs = getSharedPreferences("Cart", MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = mPrefs.edit();
ArrayList<ItmModel> arrayList = new ArrayList<>();
AtomicReference<ItmModel> itmModel = new AtomicReference<>(new ItmModel(item.getText().toString(), attr.getText().toString(),
pric.getText().toString(), sise.getText().toString(), image, company));
arrayList.add(itmModel.get());
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ItmModel>>() {
}.getType();
String list = gson.toJson(arrayList, type);
prefsEditor.putString("Cart", list);
prefsEditor.apply();
}
});
我正在这样检索它:
SharedPreferences sharedPreferences = getSharedPreferences("Cart", MODE_PRIVATE);
Gson gson = new Gson();
String list = sharedPreferences.getString("Cart", "");
Type type = new TypeToken<ArrayList<ItmModel>>() {
}.getType();
arrayList = gson.fromJson(list, type);
if (arrayList == null) {
arrayList = new ArrayList<>();
}
final CrtAdapter crtAdapter = new CrtAdapter(arrayList);
RecyclerView recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setAdapter(crtAdapter);
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(linearLayoutManager);
runLayoutAnimation(recyclerView);
recyclerView.setOnFlingListener(null);
尽管我进行了所有尝试,RecyclerView
始终是空的,当我检查我的 File explorer
时,Preference
是空的,就像 screenshot
还有这个
我的POJO
既是Parcelable
又是Serializable
。我做错了什么?我会 post 任何需要的代码。谢谢。
这是我从点击日志中得到的结果 event.I 看到对象已添加但后来从 list.Why 中删除 这会发生吗?
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26 (SharedPreferencesImpl-load): calling run()
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: exiting
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: detach (group=0x418d8ce0)
**04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: removing from list
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: bye!
04-06 09:53:43.143 4078-4078/kamble.gml.woodleyint D/Cart: [[]]**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26 (pool-3-thread-1): calling run()
这是我的 POJO
:
public class ItmModel extends ArrayList implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
@Override
public ItmModel createFromParcel(Parcel in) {
return new ItmModel(in);
}
@Override
public ItmModel[] newArray(int size) {
return new ItmModel[size];
}
};
private String name;
private String attr;
private String size;
private String pric;
private String imag;
private String comp;
public ItmModel(String name, String attr, String size, String pric, String imag, String comp) {
this.name = name;
this.attr = attr;
this.size = size;
this.pric = pric;
this.imag = imag;
this.comp = comp;
}
public ItmModel() {
}
private ItmModel(Parcel in) {
name = in.readString();
attr = in.readString();
size = in.readString();
pric = in.readString();
imag = in.readString();
comp = in.readString();
}
public String getName() {
return name;
}
public void setName(String companyName) {
this.comp = companyName;
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getPric() {
return pric;
}
public void setPric(String pric) {
this.pric = pric;
}
public String getImag() {
return imag;
}
public void setImag(String imag) {
this.imag = imag;
}
public String getComp() {
return comp;
}
public void setComp(String comp) {
this.comp = comp;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(attr);
dest.writeString(size);
dest.writeString(pric);
dest.writeString(imag);
dest.writeString(comp);
}}
检查这个,它可能对你有帮助
private void savePinnedFeedsToPrefrence(int position) {
PreferenceManager preferenceManager = new PreferenceManager(this);
Gson gson = new Gson();
String pinnedList = preferenceManager.getPinnedFeeds(AppConstants.PINNED_FEEDS);
List<FootballFeed> pinnedFeedsList;
if ("".contentEquals(pinnedList)) {
pinnedFeedsList = new ArrayList<>();
} else {
pinnedFeedsList = gson.fromJson(pinnedList,
new TypeToken<List<FootballFeed>>() {
}.getType());
}
pinnedFeedsList.add(footballFeeds.get(position));
preferenceManager.savePinnedFeeds(gson.toJson(pinnedFeedsList));
}
这些是我的检索方法,
public void savePinnedFeeds(String value) {
editor.putString(AppConstants.PINNED_FEEDS, value);
editor.commit();
}
public String getPinnedFeeds(String key) {
return sharedPreferences.getString(AppConstants.PINNED_FEEDS, "");
}
尝试删除 AtomicReference
并直接将 item
添加到 list
,如
ArrayList<ItmModel> arrayList = new ArrayList<>();
ItmModel itmModel = new ItmModel(item.getText().toString(), attr.getText().toString(),pric.getText().toString(), sise.getText().toString(), image, company);
arrayList.add(itmModel);
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ItmModel>>() {}.getType();
String list = gson.toJson(arrayList, type);
prefsEditor.putString("Cart", list);
prefsEditor.apply();
你为什么还要在 POJO
中扩展 ArrayList
,删除部分 POJO
并将其修改为以下
public class ItmModel implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
@Override
public ItmModel createFromParcel(Parcel in) {
return new ItmModel(in);
}
@Override
public ItmModel[] newArray(int size) {
return new ItmModel[size];
}
};
@Expose
private String name;
@Expose
private String attr;
@Expose
private String size;
@Expose
private String pric;
@Expose
private String imag;
@Expose
private String comp;
//rest of code as it is
}
To save custom array list you need to follow bellow step:
step 1: You need to creat cutom bean class.
public class Bean {
String name,number;
public Bean(String name,String number){
this.name=name;
this.number=number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
step 2: You need to create function to save array list to SharedPreferences.
public void saveArrayList(ArrayList<Bean> list, String key) {
SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply(); // This line is IMPORTANT !!!
}
step 3: You need to create function to get array list from SharedPreferences.
public ArrayList<Bean> getArrayList(String key)
{
SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<Bean>>() {}.getType();
return gson.fromJson(json, type);
}
step 4: How to call save and retrieve array list function.
ArrayList<Bean> listSave=new ArrayList<>();
listSave.add(new Bean("test","1"));
listSave.add(new Bean("test","2"));
saveArrayList(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<Bean> listGet=new ArrayList<>();
listGet=getArrayList("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());
=> 不要忘记在你的应用级别添加 gson 库 build.gradle。
实施'com.google.code.gson:gson:2.8.2'
我有一个 ArrayList
的自定义 POJO
对象,我想将它们保存到 SharedPreferences
中,这样它们就不会被垃圾回收,并且用户在应用程序后仍然可以访问它们已关闭。
我试过使用 GSON
,但我认为我缺少一些我不能 see.The String
我的 Object
已转换为已保存正确但没有存储任何内容。
我正在使用这个 Click event
来存储:
cartBut.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getBaseContext(), "Clicked", Toast.LENGTH_SHORT).show();
SharedPreferences mPrefs = getSharedPreferences("Cart", MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = mPrefs.edit();
ArrayList<ItmModel> arrayList = new ArrayList<>();
AtomicReference<ItmModel> itmModel = new AtomicReference<>(new ItmModel(item.getText().toString(), attr.getText().toString(),
pric.getText().toString(), sise.getText().toString(), image, company));
arrayList.add(itmModel.get());
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ItmModel>>() {
}.getType();
String list = gson.toJson(arrayList, type);
prefsEditor.putString("Cart", list);
prefsEditor.apply();
}
});
我正在这样检索它:
SharedPreferences sharedPreferences = getSharedPreferences("Cart", MODE_PRIVATE);
Gson gson = new Gson();
String list = sharedPreferences.getString("Cart", "");
Type type = new TypeToken<ArrayList<ItmModel>>() {
}.getType();
arrayList = gson.fromJson(list, type);
if (arrayList == null) {
arrayList = new ArrayList<>();
}
final CrtAdapter crtAdapter = new CrtAdapter(arrayList);
RecyclerView recyclerView = view.findViewById(R.id.recyclerView);
recyclerView.setAdapter(crtAdapter);
recyclerView.setHasFixedSize(true);
recyclerView.setItemViewCacheSize(20);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(linearLayoutManager);
runLayoutAnimation(recyclerView);
recyclerView.setOnFlingListener(null);
尽管我进行了所有尝试,RecyclerView
始终是空的,当我检查我的 File explorer
时,Preference
是空的,就像 screenshot
还有这个
我的POJO
既是Parcelable
又是Serializable
。我做错了什么?我会 post 任何需要的代码。谢谢。
这是我从点击日志中得到的结果 event.I 看到对象已添加但后来从 list.Why 中删除 这会发生吗?
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:42.959 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:42.959 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:42.960 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:42.960 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26 (SharedPreferencesImpl-load): calling run()
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: exiting
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: detach (group=0x418d8ce0)
**04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: removing from list
04-06 09:53:42.968 4078-4455/kamble.gml.woodleyint D/dalvikvm: threadid=26: bye!
04-06 09:53:43.143 4078-4078/kamble.gml.woodleyint D/Cart: [[]]**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create interp thread : stack size=128KB
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: create new thread
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: new thread created
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: update thread list
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: interp stack at 0x57bee000
04-06 09:53:43.146 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: created from interp
**04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: threadid=26: adding to list**
04-06 09:53:43.146 4078-4078/kamble.gml.woodleyint D/dalvikvm: start new thread
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26: notify debugger
04-06 09:53:43.152 4078-4456/kamble.gml.woodleyint D/dalvikvm: threadid=26 (pool-3-thread-1): calling run()
这是我的 POJO
:
public class ItmModel extends ArrayList implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
@Override
public ItmModel createFromParcel(Parcel in) {
return new ItmModel(in);
}
@Override
public ItmModel[] newArray(int size) {
return new ItmModel[size];
}
};
private String name;
private String attr;
private String size;
private String pric;
private String imag;
private String comp;
public ItmModel(String name, String attr, String size, String pric, String imag, String comp) {
this.name = name;
this.attr = attr;
this.size = size;
this.pric = pric;
this.imag = imag;
this.comp = comp;
}
public ItmModel() {
}
private ItmModel(Parcel in) {
name = in.readString();
attr = in.readString();
size = in.readString();
pric = in.readString();
imag = in.readString();
comp = in.readString();
}
public String getName() {
return name;
}
public void setName(String companyName) {
this.comp = companyName;
}
public String getAttr() {
return attr;
}
public void setAttr(String attr) {
this.attr = attr;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getPric() {
return pric;
}
public void setPric(String pric) {
this.pric = pric;
}
public String getImag() {
return imag;
}
public void setImag(String imag) {
this.imag = imag;
}
public String getComp() {
return comp;
}
public void setComp(String comp) {
this.comp = comp;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(attr);
dest.writeString(size);
dest.writeString(pric);
dest.writeString(imag);
dest.writeString(comp);
}}
检查这个,它可能对你有帮助
private void savePinnedFeedsToPrefrence(int position) {
PreferenceManager preferenceManager = new PreferenceManager(this);
Gson gson = new Gson();
String pinnedList = preferenceManager.getPinnedFeeds(AppConstants.PINNED_FEEDS);
List<FootballFeed> pinnedFeedsList;
if ("".contentEquals(pinnedList)) {
pinnedFeedsList = new ArrayList<>();
} else {
pinnedFeedsList = gson.fromJson(pinnedList,
new TypeToken<List<FootballFeed>>() {
}.getType());
}
pinnedFeedsList.add(footballFeeds.get(position));
preferenceManager.savePinnedFeeds(gson.toJson(pinnedFeedsList));
}
这些是我的检索方法,
public void savePinnedFeeds(String value) {
editor.putString(AppConstants.PINNED_FEEDS, value);
editor.commit();
}
public String getPinnedFeeds(String key) {
return sharedPreferences.getString(AppConstants.PINNED_FEEDS, "");
}
尝试删除 AtomicReference
并直接将 item
添加到 list
,如
ArrayList<ItmModel> arrayList = new ArrayList<>();
ItmModel itmModel = new ItmModel(item.getText().toString(), attr.getText().toString(),pric.getText().toString(), sise.getText().toString(), image, company);
arrayList.add(itmModel);
Gson gson = new Gson();
Type type = new TypeToken<ArrayList<ItmModel>>() {}.getType();
String list = gson.toJson(arrayList, type);
prefsEditor.putString("Cart", list);
prefsEditor.apply();
你为什么还要在 POJO
中扩展 ArrayList
,删除部分 POJO
并将其修改为以下
public class ItmModel implements Parcelable, Serializable {
@SuppressWarnings("unused")
public static final Parcelable.Creator<ItmModel> CREATOR = new Parcelable.Creator<ItmModel>() {
@Override
public ItmModel createFromParcel(Parcel in) {
return new ItmModel(in);
}
@Override
public ItmModel[] newArray(int size) {
return new ItmModel[size];
}
};
@Expose
private String name;
@Expose
private String attr;
@Expose
private String size;
@Expose
private String pric;
@Expose
private String imag;
@Expose
private String comp;
//rest of code as it is
}
To save custom array list you need to follow bellow step:
step 1: You need to creat cutom bean class.
public class Bean {
String name,number;
public Bean(String name,String number){
this.name=name;
this.number=number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
step 2: You need to create function to save array list to SharedPreferences.
public void saveArrayList(ArrayList<Bean> list, String key) {
SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
Gson gson = new Gson();
String json = gson.toJson(list);
editor.putString(key, json);
editor.apply(); // This line is IMPORTANT !!!
}
step 3: You need to create function to get array list from SharedPreferences.
public ArrayList<Bean> getArrayList(String key)
{
SharedPreferences prefs = getSharedPreferences("TestDemo", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<Bean>>() {}.getType();
return gson.fromJson(json, type);
}
step 4: How to call save and retrieve array list function.
ArrayList<Bean> listSave=new ArrayList<>();
listSave.add(new Bean("test","1"));
listSave.add(new Bean("test","2"));
saveArrayList(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<Bean> listGet=new ArrayList<>();
listGet=getArrayList("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());
=> 不要忘记在你的应用级别添加 gson 库 build.gradle。
实施'com.google.code.gson:gson:2.8.2'