Save ArrayList to SharedPreferences


Save ArrayList to SharedPreferences



I have an ArrayList with custom objects. Each custom object contains a variety of strings and numbers. I need the array to stick around even if the user leaves the activity and then wants to come back at a later time, however I don't need the array available after the application has been closed completely. I save a lot of other objects this way by using the SharedPreferences but I can't figure out how to save my entire array this way. Is this possible? Maybe SharedPreferences isn't the way to go about this? Is there a simpler method?


ArrayList


SharedPreferences


SharedPreferences





You can find Answer here : stackoverflow.com/questions/14981233/…
– Apurva Kolapkar
Oct 25 '16 at 10:10





this is the complete example go through the url stackoverflow.com/a/41137562/4344659
– Sanjeev Sangral
Dec 14 '16 at 11:53




28 Answers
28



After API 11 the SharedPreferences Editor accept Sets. You could convert your List into a HashSet or something similar and store it like that. When your read it back, convert it into an ArrayList, sort it if needed and you're good to go.


SharedPreferences Editor


Sets


HashSet


ArrayList


//Retrieve the values
Set<String> set = myScores.getStringSet("key", null);

//Set the values
Set<String> set = new HashSet<String>();
set.addAll(listOfExistingScores);
scoreEditor.putStringSet("key", set);
scoreEditor.commit();



You can also serialize your ArrayList and then save/read it to/from SharedPreferences. Below is the solution:


ArrayList


SharedPreferences



EDIT:
Ok, below is the solution to save ArrayList as serialized object to SharedPreferences and then read it from SharedPreferences.


ArrayList


SharedPreferences



Because API supports only storing and retrieving of strings to/from SharedPreferences (after API 11, its simpler), we have to serialize and de-serialize the ArrayList object which has the list of tasks into string.



In the addTask() method of the TaskManagerApplication class, we have to get the instance of the shared preference and then store the serialized ArrayList using the putString() method:


addTask()


putString()


public void addTask(Task t) {
if (null == currentTasks) {
currentTasks = new ArrayList<task>();
}
currentTasks.add(t);

// save the task list to preference
SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);
Editor editor = prefs.edit();
try {
editor.putString(TASKS, ObjectSerializer.serialize(currentTasks));
} catch (IOException e) {
e.printStackTrace();
}
editor.commit();
}



Similarly we have to retrieve the list of tasks from the preference in the onCreate() method:


onCreate()


public void onCreate() {
super.onCreate();
if (null == currentTasks) {
currentTasks = new ArrayList<task>();
}

// load tasks from preference
SharedPreferences prefs = getSharedPreferences(SHARED_PREFS_FILE, Context.MODE_PRIVATE);

try {
currentTasks = (ArrayList<task>) ObjectSerializer.deserialize(prefs.getString(TASKS, ObjectSerializer.serialize(new ArrayList<task>())));
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}



You can get ObjectSerializer class from Apache Pig project ObjectSerializer.java


ObjectSerializer





Keep in mind that putStringSet was added at API 11. Most current programmers target at lease API 8 (Froyo).
– Cristian
Aug 14 '11 at 15:51


putStringSet





I like the idea of this method because it seems to be the cleanest, but the array I am looking to store is a custom class object that contains strings, doubles, and booleans. How do I go about adding all 3 of these types to a set? Do I have to set every individual object to their own array and then add them individually to separate sets before I store, or is there a simpler way?
– ryandlf
Aug 15 '11 at 0:48





Like Christian said, this feature was added at API 11 and I don't recommend you to use this, because API 11 is used by very small group of devices. Look for my EDIT section - there's a suggestion for an earlier API versions.
– evilone
Aug 15 '11 at 5:42





What is scoreEditor?
– Ruchir Baronia
Jan 30 '16 at 20:03


scoreEditor





You can also use Google's Gson.
– Meet
Sep 26 '16 at 6:34



Using this object --> TinyDB--Android-Shared-Preferences-Turbo its very simple.


TinyDB tinydb = new TinyDB(context);



to put


tinydb.putList("MyUsers", mUsersArray);



to get


tinydb.getList("MyUsers");





This is best Approach. +1 from my side
– Sritam Jagadev
Apr 3 '15 at 9:12





Me too. Extremelly useful!!
– Juan Aguilar Guisado
Jun 10 '15 at 10:27





Awesome man...Its a life saver..
– Haresh Chaudhary
Sep 29 '15 at 2:58





This is very useful! simple and very clean code!
– veradiego31
Oct 31 '15 at 23:26





depending on the content of your List, you have to specify the object type of your list when calling tinydb.putList() Look at the examples at the linked page.
– kc ochibili
Mar 24 '16 at 5:39


tinydb.putList()



Saving Array in SharedPreferences:


Array


SharedPreferences


public static boolean saveArray()
{
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor mEdit1 = sp.edit();
/* sKey is an array */
mEdit1.putInt("Status_size", sKey.size());

for(int i=0;i<sKey.size();i++)
{
mEdit1.remove("Status_" + i);
mEdit1.putString("Status_" + i, sKey.get(i));
}

return mEdit1.commit();
}



Loading Array Data from SharedPreferences


Array


SharedPreferences


public static void loadArray(Context mContext)
{
SharedPreferences mSharedPreference1 = PreferenceManager.getDefaultSharedPreferences(mContext);
sKey.clear();
int size = mSharedPreference1.getInt("Status_size", 0);

for(int i=0;i<size;i++)
{
sKey.add(mSharedPreference1.getString("Status_" + i, null));
}

}





this is a very nice "hack". Be aware that with this method, there is always the posibility of bloating the SharedPreferences with unused old values. For example a list might have a size of 100 on a run, and then a size of 50. The 50 old entries will remain on the preferences. One way is setting a MAX value and clearing anything up to that.
– Iraklis
Feb 17 '13 at 12:17






@Iraklis Indeed, but assuming that you store only this ArrayList into SharedPrefeneces you could use mEdit1.clear() to avoid this.
– AlexAndro
Apr 4 '13 at 20:41


ArrayList


SharedPrefeneces


mEdit1.clear()





I like this "hack". But mEdit1.clear() will erase other values not relevant to this purpose?
– Zhou Hao
Oct 5 '13 at 5:42






Thanks! If you mind me asking, is there a necessary purpose for .remove()? Won't the preference just overwrite anyway?
– Script Kitty
Mar 13 '16 at 18:29



You can convert it to JSON String and store the string in the SharedPreferences.


JSON String


SharedPreferences





I'm finding a ton of code on converting ArrayLists to JSONArrays, but do you have a sample you might be willing to share on how to convert over to JSONString so I can store it in the SharedPrefs?
– ryandlf
Aug 15 '11 at 12:22





using toString()
– MByD
Aug 15 '11 at 12:52





But then how do I get it back out of SharedPrefs and convert it back into an ArrayList?
– ryandlf
Aug 15 '11 at 12:55





I'm sorry, I don't have an Android SDK to test it now, but take a look here: benjii.me/2010/04/deserializing-json-in-android-using-gson . You should iterate over the json array and do what they do there for each object, hopefully I'll be able to post an edit to my answer with a full example tomorrow.
– MByD
Aug 15 '11 at 13:12






@ryandlf I created a gist what does that: gist.github.com/JoachimR/c60aae1bb4b7076332b2
– IHeartAndroid
Nov 24 '15 at 9:50



As @nirav said, best solution is store it in sharedPrefernces as a json text by using Gson utility class. Below sample code:


//Retrieve the values
Gson gson = new Gson();
String jsonText = Prefs.getString("key", null);
String text = gson.fromJson(jsonText, String.class); //EDIT: gso to gson


//Set the values
Gson gson = new Gson();
List<String> textList = new ArrayList<String>();
textList.addAll(data);
String jsonText = gson.toJson(textList);
prefsEditor.putString("key", jsonText);
prefsEditor.apply();





Thank God, that was a life saver. Very simple indeed.
– Parthiban M
Feb 23 '16 at 7:18





This answer shoud be way up. Superb! Had no idea I can use Gson this way. First time to see the array notation used this way too. Thank you!
– madu
Jun 21 '17 at 14:55





To convert it back to List, List<String> textList = Arrays.asList(gson.fromJson(jsonText, String.class));
– Vamsi Challa
Mar 25 at 6:57



Hey friends I got the solution of above problem without using Gson library. Here I post source code.


Gson



1.Variable declaration i.e


SharedPreferences shared;
ArrayList<String> arrPackage;



2.Variable initialization i.e


shared = getSharedPreferences("App_settings", MODE_PRIVATE);
// add values for your ArrayList any where...
arrPackage = new ArrayList<>();



3.Store value to sharedPreference using packagesharedPreferences():


packagesharedPreferences()


private void packagesharedPreferences() {
SharedPreferences.Editor editor = shared.edit();
Set<String> set = new HashSet<String>();
set.addAll(arrPackage);
editor.putStringSet("DATE_LIST", set);
editor.apply();
Log.d("storesharedPreferences",""+set);
}



4.Retrive value of sharedPreference using retriveSharedValue():


retriveSharedValue()


private void retriveSharedValue() {
Set<String> set = shared.getStringSet("DATE_LIST", null);
arrPackage.addAll(set);
Log.d("retrivesharedPreferences",""+set);
}



I hope it will helpful for you...





great solution ! easy and fast !
– LoveAndroid
Oct 21 '16 at 5:58





This would remove all duplicate strings from the list as soon as you add to a set. Probably not a wanted feature
– cricket_007
Oct 29 '16 at 0:32





Is it only for a list of Strings?
– CoolMind
May 2 '17 at 19:02


String





You will lose order this way
– Brian Reinhold
Jun 21 at 10:17



Android SharedPreferances allow you to save primitive types (Boolean, Float, Int, Long, String and StringSet which available since API11) in memory as an xml file.



The key idea of any solution would be to convert the data to one of those primitive types.



I personally love to convert the my list to json format and then save it as a String in a SharedPreferences value.



In order to use my solution you'll have to add Google Gson lib.



In gradle just add the following dependency (please use google's latest version):


compile 'com.google.code.gson:gson:2.6.2'



Save data (where HttpParam is your object):


List<HttpParam> httpParamList = "**get your list**"
String httpParamJSONList = new Gson().toJson(httpParamList);

SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(**"your_prefes_key"**, httpParamJSONList);

editor.apply();



Retrieve Data (where HttpParam is your object):


SharedPreferences prefs = getSharedPreferences(**"your_prefes_key"**, Context.MODE_PRIVATE);
String httpParamJSONList = prefs.getString(**"your_prefes_key"**, "");

List<HttpParam> httpParamList =
new Gson().fromJson(httpParamJSONList, new TypeToken<List<HttpParam>>() {
}.getType());





Thanks. This answer helped me retrieve and save my List<MyObject>.
– vis
Apr 25 at 6:22



best way is that convert to JSOn string using GSON and save this string to SharedPreference.
I also use this way to cache responses.



You can also convert the arraylist into a String and save that in preference


private String convertToString(ArrayList<String> list) {

StringBuilder sb = new StringBuilder();
String delim = "";
for (String s : list)
{
sb.append(delim);
sb.append(s);;
delim = ",";
}
return sb.toString();
}

private ArrayList<String> convertToArray(String string) {

ArrayList<String> list = new ArrayList<String>(Arrays.asList(string.split(",")));
return list;
}



You can save the Arraylist after converting it to string using convertToString method and retrieve the string and convert it to array using convertToArray


convertToString


convertToArray



After API 11 you can save set directly to SharedPreferences though !!! :)



You could refer the serializeKey() and deserializeKey() functions from FacebookSDK's SharedPreferencesTokenCache class. It converts the supportedType into the JSON object and store the JSON string into SharedPreferences. You could download SDK from here


private void serializeKey(String key, Bundle bundle, SharedPreferences.Editor editor)
throws JSONException {
Object value = bundle.get(key);
if (value == null) {
// Cannot serialize null values.
return;
}

String supportedType = null;
JSONArray jsonArray = null;
JSONObject json = new JSONObject();

if (value instanceof Byte) {
supportedType = TYPE_BYTE;
json.put(JSON_VALUE, ((Byte)value).intValue());
} else if (value instanceof Short) {
supportedType = TYPE_SHORT;
json.put(JSON_VALUE, ((Short)value).intValue());
} else if (value instanceof Integer) {
supportedType = TYPE_INTEGER;
json.put(JSON_VALUE, ((Integer)value).intValue());
} else if (value instanceof Long) {
supportedType = TYPE_LONG;
json.put(JSON_VALUE, ((Long)value).longValue());
} else if (value instanceof Float) {
supportedType = TYPE_FLOAT;
json.put(JSON_VALUE, ((Float)value).doubleValue());
} else if (value instanceof Double) {
supportedType = TYPE_DOUBLE;
json.put(JSON_VALUE, ((Double)value).doubleValue());
} else if (value instanceof Boolean) {
supportedType = TYPE_BOOLEAN;
json.put(JSON_VALUE, ((Boolean)value).booleanValue());
} else if (value instanceof Character) {
supportedType = TYPE_CHAR;
json.put(JSON_VALUE, value.toString());
} else if (value instanceof String) {
supportedType = TYPE_STRING;
json.put(JSON_VALUE, (String)value);
} else {
// Optimistically create a JSONArray. If not an array type, we can null
// it out later
jsonArray = new JSONArray();
if (value instanceof byte) {
supportedType = TYPE_BYTE_ARRAY;
for (byte v : (byte)value) {
jsonArray.put((int)v);
}
} else if (value instanceof short) {
supportedType = TYPE_SHORT_ARRAY;
for (short v : (short)value) {
jsonArray.put((int)v);
}
} else if (value instanceof int) {
supportedType = TYPE_INTEGER_ARRAY;
for (int v : (int)value) {
jsonArray.put(v);
}
} else if (value instanceof long) {
supportedType = TYPE_LONG_ARRAY;
for (long v : (long)value) {
jsonArray.put(v);
}
} else if (value instanceof float) {
supportedType = TYPE_FLOAT_ARRAY;
for (float v : (float)value) {
jsonArray.put((double)v);
}
} else if (value instanceof double) {
supportedType = TYPE_DOUBLE_ARRAY;
for (double v : (double)value) {
jsonArray.put(v);
}
} else if (value instanceof boolean) {
supportedType = TYPE_BOOLEAN_ARRAY;
for (boolean v : (boolean)value) {
jsonArray.put(v);
}
} else if (value instanceof char) {
supportedType = TYPE_CHAR_ARRAY;
for (char v : (char)value) {
jsonArray.put(String.valueOf(v));
}
} else if (value instanceof List<?>) {
supportedType = TYPE_STRING_LIST;
@SuppressWarnings("unchecked")
List<String> stringList = (List<String>)value;
for (String v : stringList) {
jsonArray.put((v == null) ? JSONObject.NULL : v);
}
} else {
// Unsupported type. Clear out the array as a precaution even though
// it is redundant with the null supportedType.
jsonArray = null;
}
}

if (supportedType != null) {
json.put(JSON_VALUE_TYPE, supportedType);
if (jsonArray != null) {
// If we have an array, it has already been converted to JSON. So use
// that instead.
json.putOpt(JSON_VALUE, jsonArray);
}

String jsonString = json.toString();
editor.putString(key, jsonString);
}
}

private void deserializeKey(String key, Bundle bundle)
throws JSONException {
String jsonString = cache.getString(key, "{}");
JSONObject json = new JSONObject(jsonString);

String valueType = json.getString(JSON_VALUE_TYPE);

if (valueType.equals(TYPE_BOOLEAN)) {
bundle.putBoolean(key, json.getBoolean(JSON_VALUE));
} else if (valueType.equals(TYPE_BOOLEAN_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
boolean array = new boolean[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = jsonArray.getBoolean(i);
}
bundle.putBooleanArray(key, array);
} else if (valueType.equals(TYPE_BYTE)) {
bundle.putByte(key, (byte)json.getInt(JSON_VALUE));
} else if (valueType.equals(TYPE_BYTE_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
byte array = new byte[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = (byte)jsonArray.getInt(i);
}
bundle.putByteArray(key, array);
} else if (valueType.equals(TYPE_SHORT)) {
bundle.putShort(key, (short)json.getInt(JSON_VALUE));
} else if (valueType.equals(TYPE_SHORT_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
short array = new short[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = (short)jsonArray.getInt(i);
}
bundle.putShortArray(key, array);
} else if (valueType.equals(TYPE_INTEGER)) {
bundle.putInt(key, json.getInt(JSON_VALUE));
} else if (valueType.equals(TYPE_INTEGER_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
int array = new int[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = jsonArray.getInt(i);
}
bundle.putIntArray(key, array);
} else if (valueType.equals(TYPE_LONG)) {
bundle.putLong(key, json.getLong(JSON_VALUE));
} else if (valueType.equals(TYPE_LONG_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
long array = new long[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = jsonArray.getLong(i);
}
bundle.putLongArray(key, array);
} else if (valueType.equals(TYPE_FLOAT)) {
bundle.putFloat(key, (float)json.getDouble(JSON_VALUE));
} else if (valueType.equals(TYPE_FLOAT_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
float array = new float[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = (float)jsonArray.getDouble(i);
}
bundle.putFloatArray(key, array);
} else if (valueType.equals(TYPE_DOUBLE)) {
bundle.putDouble(key, json.getDouble(JSON_VALUE));
} else if (valueType.equals(TYPE_DOUBLE_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
double array = new double[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
array[i] = jsonArray.getDouble(i);
}
bundle.putDoubleArray(key, array);
} else if (valueType.equals(TYPE_CHAR)) {
String charString = json.getString(JSON_VALUE);
if (charString != null && charString.length() == 1) {
bundle.putChar(key, charString.charAt(0));
}
} else if (valueType.equals(TYPE_CHAR_ARRAY)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
char array = new char[jsonArray.length()];
for (int i = 0; i < array.length; i++) {
String charString = jsonArray.getString(i);
if (charString != null && charString.length() == 1) {
array[i] = charString.charAt(0);
}
}
bundle.putCharArray(key, array);
} else if (valueType.equals(TYPE_STRING)) {
bundle.putString(key, json.getString(JSON_VALUE));
} else if (valueType.equals(TYPE_STRING_LIST)) {
JSONArray jsonArray = json.getJSONArray(JSON_VALUE);
int numStrings = jsonArray.length();
ArrayList<String> stringList = new ArrayList<String>(numStrings);
for (int i = 0; i < numStrings; i++) {
Object jsonStringValue = jsonArray.get(i);
stringList.add(i, jsonStringValue == JSONObject.NULL ? null : (String)jsonStringValue);
}
bundle.putStringArrayList(key, stringList);
}
}



I have read all answers above. That is all correct but i found a more easy solution as below:



Saving String List in shared-preference>>


public static void setSharedPreferenceStringList(Context pContext, String pKey, List<String> pData) {
SharedPreferences.Editor editor = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
editor.putInt(pKey + "size", pData.size());
editor.commit();

for (int i = 0; i < pData.size(); i++) {
SharedPreferences.Editor editor1 = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).edit();
editor1.putString(pKey + i, (pData.get(i)));
editor1.commit();
}



}



and for getting String List from Shared-preference>>


public static List<String> getSharedPreferenceStringList(Context pContext, String pKey) {
int size = pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getInt(pKey + "size", 0);
List<String> list = new ArrayList<>();
for (int i = 0; i < size; i++) {
list.add(pContext.getSharedPreferences(Constants.APP_PREFS, Activity.MODE_PRIVATE).getString(pKey + i, ""));
}
return list;
}



Here Constants.APP_PREFS is the name of the file to open; can not contain path separators.


Constants.APP_PREFS



Why don't you stick your arraylist on an Application class? It only get's destroyed when the app is really killed, so, it will stick around for as long as the app is available.





What if the application is relaunched again.
– Manohar Perepa
May 29 '15 at 9:47



The best way i have been able to find is a make a 2D Array of keys and put the custom items of the array in the 2-D array of keys and then retrieve it through the 2D arra on startup.
I did not like the idea of using string set because most of the android users are still on Gingerbread and using string set requires honeycomb.



Sample Code:
here ditor is the shared pref editor and rowitem is my custom object.


editor.putString(genrealfeedkey[j][1], Rowitemslist.get(j).getname());
editor.putString(genrealfeedkey[j][2], Rowitemslist.get(j).getdescription());
editor.putString(genrealfeedkey[j][3], Rowitemslist.get(j).getlink());
editor.putString(genrealfeedkey[j][4], Rowitemslist.get(j).getid());
editor.putString(genrealfeedkey[j][5], Rowitemslist.get(j).getmessage());



following code is the accepted answer, with a few more lines for new folks (me), eg. shows how to convert the set type object back to arrayList, and additional guidance on what goes before '.putStringSet' and '.getStringSet'. (thank you evilone)


// shared preferences
private SharedPreferences preferences;
private SharedPreferences.Editor nsuserdefaults;

// setup persistent data
preferences = this.getSharedPreferences("MyPreferences", MainActivity.MODE_PRIVATE);
nsuserdefaults = preferences.edit();

arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
//Retrieve followers from sharedPreferences
Set<String> set = preferences.getStringSet("following", null);

if (set == null) {
// lazy instantiate array
arrayOfMemberUrlsUserIsFollowing = new ArrayList<String>();
} else {
// there is data from previous run
arrayOfMemberUrlsUserIsFollowing = new ArrayList<>(set);
}

// convert arraylist to set, and save arrayOfMemberUrlsUserIsFollowing to nsuserdefaults
Set<String> set = new HashSet<String>();
set.addAll(arrayOfMemberUrlsUserIsFollowing);
nsuserdefaults.putStringSet("following", set);
nsuserdefaults.commit();


//Set the values
intent.putParcelableArrayListExtra("key",collection);

//Retrieve the values
ArrayList<OnlineMember> onlineMembers = data.getParcelableArrayListExtra("key");



don't forget to implement Serializable:


Class dataBean implements Serializable{
public String name;
}
ArrayList<dataBean> dataBeanArrayList = new ArrayList();



https://stackoverflow.com/a/7635154/4639974



You can convert it to a Map Object to store it, then change the values back to an ArrayList when you retrieve the SharedPreferences.


Map


SharedPreferences



You can use serialization or Gson library to convert list to string and vice versa and then save string in preferences.



Using google's Gson library:


//Converting list to string
new Gson().toJson(list);

//Converting string to list
new Gson().fromJson(listString, CustomObjectsList.class);



Using Java serialization:


//Converting list to string
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(list);
oos.flush();
String string = Base64.encodeToString(bos.toByteArray(), Base64.DEFAULT);
oos.close();
bos.close();
return string;

//Converting string to list
byte bytesArray = Base64.decode(familiarVisitsString, Base64.DEFAULT);
ByteArrayInputStream bis = new ByteArrayInputStream(bytesArray);
ObjectInputStream ois = new ObjectInputStream(bis);
Object clone = ois.readObject();
ois.close();
bis.close();
return (CustomObjectsList) clone;



Use this custom class:


public class SharedPreferencesUtil {

public static void pushStringList(SharedPreferences sharedPref,
List<String> list, String uniqueListName) {

SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(uniqueListName + "_size", list.size());

for (int i = 0; i < list.size(); i++) {
editor.remove(uniqueListName + i);
editor.putString(uniqueListName + i, list.get(i));
}
editor.apply();
}

public static List<String> pullStringList(SharedPreferences sharedPref,
String uniqueListName) {

List<String> result = new ArrayList<>();
int size = sharedPref.getInt(uniqueListName + "_size", 0);

for (int i = 0; i < size; i++) {
result.add(sharedPref.getString(uniqueListName + i, null));
}
return result;
}
}



How to use:


SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
SharedPreferencesUtil.pushStringList(sharedPref, list, getString(R.string.list_name));
List<String> list = SharedPreferencesUtil.pullStringList(sharedPref, getString(R.string.list_name));



Also with Kotlin:


fun SharedPreferences.Editor.putIntegerArrayList(key: String, list: ArrayList<Int>?): SharedPreferences.Editor {
putString(key, list?.joinToString(",") ?: "")
return this
}

fun SharedPreferences.getIntegerArrayList(key: String, defValue: ArrayList<Int>?): ArrayList<Int>? {
val value = getString(key, null)
if (value.isNullOrBlank())
return defValue
return value.split(",").map { it.toInt() }.toArrayList()
}


public void saveUserName(Context con,String username)
{
try
{
usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
usernameEditor = usernameSharedPreferences.edit();
usernameEditor.putInt(PREFS_KEY_SIZE,(USERNAME.size()+1));
int size=USERNAME.size();//USERNAME is arrayList
usernameEditor.putString(PREFS_KEY_USERNAME+size,username);
usernameEditor.commit();
}
catch(Exception e)
{
e.printStackTrace();
}

}
public void loadUserName(Context con)
{
try
{
usernameSharedPreferences= PreferenceManager.getDefaultSharedPreferences(con);
size=usernameSharedPreferences.getInt(PREFS_KEY_SIZE,size);
USERNAME.clear();
for(int i=0;i<size;i++)
{
String username1="";
username1=usernameSharedPreferences.getString(PREFS_KEY_USERNAME+i,username1);
USERNAME.add(username1);
}
usernameArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, USERNAME);
username.setAdapter(usernameArrayAdapter);
username.setThreshold(0);

}
catch(Exception e)
{
e.printStackTrace();
}
}



All of the above answers are correct. :) I myself used one of these for my situation. However when I read the question I found that the OP is actually talking about a different scenario than the title of this post, if I didn't get it wrong.



"I need the array to stick around even if the user leaves the activity and then wants to come back at a later time"



He actually wants the data to be stored till the app is open, irrespective of user changing screens within the application.



"however I don't need the array available after the application has been closed completely"



But once the application is closed data should not be preserved.Hence I feel using SharedPreferences is not the optimal way for this.


SharedPreferences



What one can do for this requirement is create a class which extends Application class.


Application


public class MyApp extends Application {

//Pardon me for using global ;)

private ArrayList<CustomObject> globalArray;

public void setGlobalArrayOfCustomObjects(ArrayList<CustomObject> newArray){
globalArray = newArray;
}

public ArrayList<CustomObject> getGlobalArrayOfCustomObjects(){
return globalArray;
}

}



Using the setter and getter the ArrayList can be accessed from anywhere withing the Application. And the best part is once the app is closed, we do not have to worry about the data being stored. :)



It's very simple using getStringSet and putStringSet in SharedPreferences, but in my case, I have to duplicate the Set object before I can add anything to the Set. Or else, the Set will not be saved if my app is force closed. Probably because of the note below in the API below. (It saved though if app is closed by back button).



Note that you must not modify the set instance returned by this call. The consistency of the stored data is not guaranteed if you do, nor is your ability to modify the instance at all.
http://developer.android.com/reference/android/content/SharedPreferences.html#getStringSet


SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
SharedPreferences.Editor editor = prefs.edit();

Set<String> outSet = prefs.getStringSet("key", new HashSet<String>());
Set<String> workingSet = new HashSet<String>(outSet);
workingSet.add("Another String");

editor.putStringSet("key", workingSet);
editor.commit();


Saving and retrieving the ArrayList From SharedPreference


public static void addToPreference(String id,Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(Constants.MyPreference, Context.MODE_PRIVATE);
ArrayList<String> list = getListFromPreference(context);
if (!list.contains(id)) {
list.add(id);
SharedPreferences.Editor edit = sharedPreferences.edit();
Set<String> set = new HashSet<>();
set.addAll(list);
edit.putStringSet(Constant.LIST, set);
edit.commit();

}
}
public static ArrayList<String> getListFromPreference(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(Constants.MyPreference, Context.MODE_PRIVATE);
Set<String> set = sharedPreferences.getStringSet(Constant.LIST, null);
ArrayList<String> list = new ArrayList<>();
if (set != null) {
list = new ArrayList<>(set);
}
return list;
}





Will this preserve order?
– Brian Reinhold
Jun 21 at 9:44





yesssssssssssssssss
– Tarun konda
Jun 21 at 10:12





My understanding is that 'Set' does not preserve order. LinkedHashSet will. And ShardePreferences will not restore a LinkedHashSet nor cast to it. SO I am not sure what will come back.
– Brian Reinhold
Jun 21 at 13:43



You can save String and custom array list using Gson library.



=>First you need to create function to save array list to SharedPreferences.


public void saveListInLocal(ArrayList<String> list, String key) {

SharedPreferences prefs = getSharedPreferences("AppName", 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 !!!

}



=> You need to create function to get array list from SharedPreferences.


public ArrayList<String> getListFromLocal(String key)
{
SharedPreferences prefs = getSharedPreferences("AppName", Context.MODE_PRIVATE);
Gson gson = new Gson();
String json = prefs.getString(key, null);
Type type = new TypeToken<ArrayList<String>>() {}.getType();
return gson.fromJson(json, type);

}



=> How to call save and retrieve array list function.


ArrayList<String> listSave=new ArrayList<>();
listSave.add("test1"));
listSave.add("test2"));
saveListInLocal(listSave,"key");
Log.e("saveArrayList:","Save ArrayList success");
ArrayList<String> listGet=new ArrayList<>();
listGet=getListFromLocal("key");
Log.e("getArrayList:","Get ArrayList size"+listGet.size());



=> Don't forgot to add gson library in you app level build.gradle.



implementation 'com.google.code.gson:gson:2.8.2'



With Kotlin, for simple arrays and lists, you can do something like:


class MyPrefs(context: Context) {
val prefs = context.getSharedPreferences("x.y.z.PREFS_FILENAME", 0)
var listOfFloats: List<Float>
get() = prefs.getString("listOfFloats", "").split(",").map { it.toFloat() }
set(value) = prefs.edit().putString("listOfFloats", value.joinToString(",")).apply()
}



and then access the preference easily:


MyPrefs(context).listOfFloats = ....
val list = MyPrefs(context).listOfFloats



I used the same manner of saving and retrieving a String but here with arrayList I've used HashSet as a mediator



To save arrayList to SharedPreferences we use HashSet:



1- we create SharedPreferences variable (in place where the change happens to the array)



2 - we convert the arrayList to HashSet



3 - then we put the stringSet and apply



4 - you getStringSet within HashSet and recreate ArrayList to set the HashSet.



public class MainActivity extends AppCompatActivity {
ArrayList arrayList = new ArrayList<>();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

SharedPreferences prefs = this.getSharedPreferences("com.example.nec.myapplication", Context.MODE_PRIVATE);

HashSet<String> set = new HashSet(arrayList);
prefs.edit().putStringSet("names", set).apply();


set = (HashSet<String>) prefs.getStringSet("names", null);
arrayList = new ArrayList(set);

Log.i("array list", arrayList.toString());
}



This method is used to store/save array list:-


public static void saveSharedPreferencesLogList(Context context, List<String> collageList) {
SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
SharedPreferences.Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(collageList);
prefsEditor.putString("myJson", json);
prefsEditor.commit();
}



This method is used to retrieve array list:-


public static List<String> loadSharedPreferencesLogList(Context context) {
List<String> savedCollage = new ArrayList<String>();
SharedPreferences mPrefs = context.getSharedPreferences("PhotoCollage", context.MODE_PRIVATE);
Gson gson = new Gson();
String json = mPrefs.getString("myJson", "");
if (json.isEmpty()) {
savedCollage = new ArrayList<String>();
} else {
Type type = new TypeToken<List<String>>() {
}.getType();
savedCollage = gson.fromJson(json, type);
}

return savedCollage;
}






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Comments

Popular posts from this blog

paramiko-expect timeout is happening after executing the command

how to run turtle graphics in Colaboratory

Export result set on Dbeaver to CSV