The question:
I have an ArrayList of an object. The object contains the types ‘Bitmap’ and ‘String’ and then just getters and setters for both. First of all is Bitmap serializable?
How would I go about serializing this to store it in SharedPreferences? I have seen many people ask a similar question but none seem to give a good answer. I would prefer some code examples if at all possible.
If bitmap is not serializable then how do I go about storing this ArrayList?
The Solutions:
Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.
Method 1
Yes, you can save your composite object in shared preferences. Let’s say..
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();
..and now you can retrieve your object as:
SharedPreferences appSharedPrefs = PreferenceManager
.getDefaultSharedPreferences(this.getApplicationContext());
Gson gson = new Gson();
String json = appSharedPrefs.getString("MyObject", "");
Student mStudentObject = gson.fromJson(json, Student.class);
For more information, click here.
If you want to get back an ArrayList
of any type object e.g. Student
, then use:
Type type = new TypeToken<List<Student>>(){}.getType();
List<Student> students = gson.fromJson(json, type);
Method 2
The answer above works, but not for list:
For saving list of objects do like this:
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);
Read the json object:
Type type = new TypeToken<List<Cars>>(){}.getType();
List<Cars> carsList = gson.fromJson(jsonCars, type);
Method 3
For me it worked like this :
Put values in SharedPreferances :
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();
To get values from SharedPreferances :
Gson gson = new Gson();
String response=shref.getString(key , "");
ArrayList<ModelClass> lstArrayList = gson.fromJson(response,
new TypeToken<List<ModelClass>>(){}.getType());
Method 4
For Save:
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();
}
For load:
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;
}
PhoneCallLog is my custom object’s name. (Contains String, long and boolean values)
Method 5
Mete’ example above worked like a charm.
Here is a Kotlin example
private var prefs: SharedPreferences = context?.getSharedPreferences("sharedPrefs", MODE_PRIVATE)
?: error("err")
private val gson = Gson()
save
fun saveObjectToArrayList(yourObject: YourObject) {
val bookmarks = fetchArrayList()
bookmarks.add(0, yourObject)
val prefsEditor = prefs.edit()
val json = gson.toJson(bookmarks)
prefsEditor.putString("your_key", json)
prefsEditor.apply()
}
read
fun fetchArrayList(): ArrayList<YourObject> {
val yourArrayList: ArrayList<YourObject>
val json = prefs.getString("your_key", "")
yourArrayList = when {
json.isNullOrEmpty() -> ArrayList()
else -> gson.fromJson(json, object : TypeToken<List<Feed>>() {}.type)
}
return yourArrayList
}
Method 6
The kotlin implementation with Gson
, extending @SpyZips’s answer,
Serializing to JSON
val jsonCars: String = Gson().toJson(cars);
Deserializing to back to list of objs
val type = object: TypeToken<List<Car>>(){}.type
val carsList: List<Car> = Gson().fromJson(jsonCars, type)
Method 7
solution
Don’t worry you can follow my code.I am using own custom class of sharedPreference for holding anytype of List in sharedPreference.
public class AuthPreference {
private static final String MY_PREFERENCES = "MY_PREFERENCES";
private static final int MODE = Context.MODE_PRIVATE;
private static AuthPreference pref;
private final SharedPreferences sharedPreference;
private final SharedPreferences.Editor editor;
@SuppressLint("CommitPrefEdits")
public AuthPreference(Context context) {
sharedPreference = context.getSharedPreferences(MY_PREFERENCES, MODE);
editor = sharedPreference.edit();
}
public void clear() {
editor.clear().commit();
}
//Here save your api responce like YourModel arraylist
public void saveDataResponce(ArrayList<YourModel> model_, String key) {
SharedPreferences.Editor editor = sharedPreference.edit();
Gson gson = new Gson();
String json = gson.toJson(model_);
editor.putString(key, json);
editor.apply();
}
//Here we get our api responce like YourModel arraylist.Using key value when you want to define.
public ArrayList<YourModel> getDataResponce(String key) {
Gson gson = new Gson();
String json = sharedPreference.getString(key, null);
Type type_ = new TypeToken<ArrayList<YourModel>>() {
}.getType();
return gson.fromJson(json, type_);
}
}
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0