ArrayList'i Paylaşılan Tercihlere Kaydet


318

Bir var ArrayListözel nesnelerle. Her özel nesne çeşitli dizeler ve sayılar içerir. Kullanıcı etkinliğini bırakır ve daha sonra tekrar gelmek istiyor, ancak uygulama tamamen kapatıldıktan sonra kullanılabilir dizi gerekmez bile etrafında sopa için dizi gerekir. Bunu kullanarak diğer nesneleri bir sürü kaydetmek SharedPreferencesama tüm dizimi bu şekilde kaydetmek nasıl anlayamıyorum. Mümkün mü? Belki SharedPreferencesde bununla ilgili bir yol değil mi? Daha basit bir yöntem var mı?


Yanıtları burada bulabilirsiniz: stackoverflow.com/questions/14981233/…
Apurva Kolapkar


Birisi çözümü arıyorsa, bu kotlin'de tam kullanım örneğiyle aradığınız cevap olabilir. stackoverflow.com/a/56873719/3710341
Sagar Chapagain 04

Yanıtlar:


432

API 11'den sonra SharedPreferences Editorkabul edin Sets. Listenizi HashSetbenzer bir şeye veya benzer bir şeye dönüştürebilir ve böyle depolayabilirsiniz. Tekrar okuduğunuzda, onu bir dönüştürün ArrayList, gerekirse sıralayın ve gitmekte fayda var.

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

Ayrıca serileştirebilir ArrayListve sonra / dan kaydedebilir / okuyabilirsiniz SharedPreferences. Çözüm aşağıdadır:

EDIT:
Tamam, aşağıda ArrayListseri hale getirilmiş nesne olarak kaydetmek SharedPreferencesve SharedPreferences onu okumak için bir çözümdür .

API yalnızca dizelerin SharedPreferences'e / onlardan (API 11'den sonra, daha basit) depolanmasını ve alınmasını desteklediğinden, görevler listesini içeren ArrayList nesnesini diziye serileştirmeli ve serileştirmeyi kaldırmalıyız.

Gelen addTask()TaskManagerApplication sınıfının yöntemine paylaştığımız tercih örneğini almak ve daha sonra kullanarak tefrika ArrayList depolamak zorunda putString()yöntemi:

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

Benzer şekilde onCreate()yöntemlerin tercihinden görevlerin listesini almak zorundayız :

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

ObjectSerializerApache Pig projesinden ObjectSerializer.java'dan ders alabilirsiniz


21
putStringSetAPI 11'de eklendiğini unutmayın. Şu anki programcıların çoğu kira API 8'i (Froyo) hedeflemektedir.
Cristian

2
En temiz gibi göründüğü için bu yöntemin fikrini seviyorum, ancak saklamak istediğim dizi dizeleri, çiftleri ve booleans içeren özel bir sınıf nesnesidir. Bu türlerin 3'ünü de bir kümeye nasıl ekleyebilirim? Her bir nesneyi kendi dizisine ayarlamam ve saklamamdan önce bunları ayrı kümelere tek tek eklemem gerekir mi, yoksa daha basit bir yol var mı?
ryandlf

5
Nedir scoreEditor?
Ruchir Baronia

2
Ekim-2016'dan sonra okuyucular için: Bu yorum zaten çok fazla oy alıyor ve benim gibi kullanabilirsiniz, ancak lütfen durun ve bunu yapmayın. HashSet yinelenen değeri atar, böylece ArrayList'iniz aynı olmaz. Ayrıntılar burada: stackoverflow.com/questions/12940663/…
seul

2
Bu yanıta rastlayanlara bir hatırlatma olarak: Bir Küme sıralanmamıştır, bu nedenle bir StringSet'in kaydedilmesi ArrayList'inizdeki sıranızı kaybedecektir.
David Liu

119

Bu nesneyi kullanma -> TinyDB - Android-Shared-Preferences-Turbo çok basit.

TinyDB tinydb = new TinyDB(context);

koymak

tinydb.putList("MyUsers", mUsersArray);

almak

tinydb.getList("MyUsers");

GÜNCELLEME

Bazı yararlı örnekler ve sorun giderme burada bulunabilir: Android Paylaşılan Tercih TinyDB putListObject işlev bozukluğu


6
Bu en iyi yaklaşımdır.
Yanımdan

3
Ben de. Son derece yararlı !!
Juan Aguilar Guisado

1
Listenizin içeriğine bağlı olarak, arama yaparken listenizin nesne türünü belirtmeniz gerekir tinydb.putList()Bağlantılı sayfadaki örneklere bakın.
kc ochibili

iyi lib, ama bazen bu kütüphane nesneleri depolarken sorunları olduğunu belirtmek gerekir. daha spesifik olmak gerekirse, yığın taşması istisnası atabilir. ve bunun nesnenin nasıl saklanacağını anlamak için yansıma kullandığını düşünüyorum ve nesne çok karmaşık hale gelirse bu istisnayı fırlatabilir.
Mr.Q

1
Seni çok seviyorum!
mychemicalro

93

Tasarruf Arrayin 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();     
}

ArrayVerileri YüklemeSharedPreferences

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

}

14
Bu çok güzel bir "hack". Bu yöntemle, SharedPreferences'ı kullanılmayan eski değerlerle şişirme olasılığının her zaman olduğunu unutmayın. Örneğin, bir liste çalışma sırasında 100, ardından 50 boyutunda olabilir. 50 eski giriş tercihlerde kalır. Bunun bir yolu MAX değeri ayarlamak ve buna kadar her şeyi silmek.
Iraklis

3
@Iraklis Gerçekten, ama sadece bunu ArrayListiçine sakladığınızı varsayarsak, bunu önlemek için SharedPrefeneceskullanabilirsiniz mEdit1.clear().
AlexAndro

1
Bu "hack" i seviyorum. Ancak mEdit1.clear () bu amaçla ilgili olmayan diğer değerleri silecek mi?
Bagusflyer

1
Teşekkürler! Bana sormayı düşünüyorsanız, .remove () için gerekli bir amaç var mı? Tercih zaten üzerine yazılmayacak mı?
Senaryo Kitty

62

Bunu JSON Stringdizeye dönüştürebilir ve dizede saklayabilirsiniz SharedPreferences.


ArrayLists JSONArrays dönüştürme bir ton kod buluyorum, ama ben SharedPrefs saklamak böylece JSONString dönüştürmek için paylaşmak isteyebilirsiniz bir örnek var mı?
ryandlf

5
kullanarak toString ()
MByD

3
Ama sonra onu SharedPrefs'den nasıl geri alabilirim ve bir ArrayList'e nasıl dönüştürebilirim?
ryandlf

Üzgünüm, şimdi test etmek için bir Android SDK'm yok, ancak buraya bir göz atın: benjii.me/2010/04/deserializing-json-in-android-using-gson . Json dizisi üzerinde yinelenmeli ve her nesne için orada yaptıklarını yapmalısınız, umarım yarın tam bir örnekle cevabım için bir düzenleme gönderebilirim.
MByD

53

@Nirav'ın dediği gibi, en iyi çözüm, Gson hizmet sınıfını kullanarak sharedPrefernces içinde json metni olarak saklamaktır. Örnek kodun altında:

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

2
Tanrıya şükür, bu bir hayat kurtarıcıydı. Gerçekten çok basit.
Parthiban M

2
Bu cevap çok yukarıda olmalı. Süper! Gson'u bu şekilde kullanabileceğime dair hiçbir fikrim yoktu. Dizi gösterimini ilk kez bu şekilde kullandı. Teşekkür ederim!
madu

3
Listeye geri dönüştürmek için List <String> textList = Arrays.asList (gson.fromJson (jsonText, String []. Sınıf));
Vamsi Challa

22

Hey arkadaşlar Gsonkütüphane kullanmadan yukarıdaki sorunun çözümünü aldım . Burada kaynak kodu gönderiyorum.

1.Değişik bildirim yani

  SharedPreferences shared;
  ArrayList<String> arrPackage;

2. değişken başlatma yani

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

3. Aşağıdakileri kullanarak sharedPreference değerine kaydedin 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. sharedPreference değerini kullanarak şunu elde edin retriveSharedValue():

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

Umarım sana yardımcı olur ...


harika bir çözüm! kolay ve hızlı!
LoveAndroid

5
Bu, bir kümeye eklediğiniz anda tüm yinelenen dizeleri listeden kaldıracaktır. Muhtemelen aranan bir özellik değil
OneCricketeer

Sadece Strings listesi için mi?
CoolMind

Bu şekilde sipariş kaybedeceksiniz
Brian Reinhold

16
/**
 *     Save and get ArrayList in SharedPreference
 */

JAVA:

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();    

}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}

Kotlin

fun saveArrayList(list: java.util.ArrayList<String?>?, key: String?) {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val editor: Editor = prefs.edit()
    val gson = Gson()
    val json: String = gson.toJson(list)
    editor.putString(key, json)
    editor.apply()
}

fun getArrayList(key: String?): java.util.ArrayList<String?>? {
    val prefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(activity)
    val gson = Gson()
    val json: String = prefs.getString(key, null)
    val type: Type = object : TypeToken<java.util.ArrayList<String?>?>() {}.getType()
    return gson.fromJson(json, type)
}

1
Evet, en iyi cevap
AlexPad

Bu en iyi cevap, diğer nesneleri de saklamak için kullanıyorum
Irfandi D. Vendy

Bunu tüm model sınıflarını depolayacağı anlamına gelir mi?
BlackBlind

13

Android SharedPreferances, ilkel türleri (Boolean, Float, Int, Long, String ve StringSet'i API11'den beri kullanılabilir) belleğe xml dosyası olarak kaydetmenizi sağlar.

Herhangi bir çözümün ana fikri, verileri bu ilkel türlerden birine dönüştürmek olacaktır.

Şahsen benim liste json biçimine dönüştürmek ve sonra SharedPreferences değeri bir dize olarak kaydetmek için seviyorum.

Çözümümü kullanabilmek için Google Gson lib'i eklemeniz gerekecek .

Derecede sadece aşağıdaki bağımlılığı ekleyin (lütfen google'ın en son sürümünü kullanın):

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

Verileri kaydedin (HttpParam nesnenizdir):

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

Verileri Al (burada HttpParam nesnenizdir):

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

Teşekkürler. Bu cevap Listemi almama ve kaydetmeme yardımcı oldu <MyObject>.
visrahane

Teşekkürler. İyi çalışıyor
Velayutham M

11

Bu senin mükemmel çözümün .. dene,

public void saveArrayList(ArrayList<String> list, String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    SharedPreferences.Editor editor = prefs.edit();
    Gson gson = new Gson();
    String json = gson.toJson(list);
    editor.putString(key, json);
    editor.apply();     // This line is IMPORTANT !!!
}

public ArrayList<String> getArrayList(String key){
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);
    Gson gson = new Gson();
    String json = prefs.getString(key, null);
    Type type = new TypeToken<ArrayList<String>>() {}.getType();
    return gson.fromJson(json, type);
}

9

Arraylist'i bir String'e dönüştürebilir ve bunu tercihen kaydedebilirsiniz

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

Arraylist'i convertToStringyöntemi kullanarak dizeye dönüştürdükten sonra kaydedebilir ve dizeyi alabilir ve kullanarak diziye dönüştürebilirsiniz.convertToArray

API 11'den sonra seti doğrudan SharedPreferences'a kaydedebilirsiniz !!! :)


6

String, int, boolean için en iyi seçim sharedPreferences olur.

ArrayList veya karmaşık verileri depolamak istiyorsanız. En iyi seçim Kağıt kitaplığı olacaktır.

Bağımlılık ekle

implementation 'io.paperdb:paperdb:2.6'

Kağıdı Başlat

Application.onCreate () içinde bir kez başlatılmalıdır:

Paper.init(context);

Kayıt etmek

List<Person> contacts = ...
Paper.book().write("contacts", contacts);

Veri yükleniyor

Depolama alanında nesne yoksa varsayılan değerleri kullanın.

List<Person> contacts = Paper.book().read("contacts", new ArrayList<>());

Hadi bakalım.

https://github.com/pilgr/Paper


5

Yukarıdaki tüm cevapları okudum. Hepsi doğru ama aşağıdaki gibi daha kolay bir çözüm buldum:

  1. Dize Listesini paylaşılan tercihte kaydetme >>

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

    }

  2. Paylaşılan tercihlerden Dize Listesi almak için >>

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

İşte Constants.APP_PREFSaçılacak dosyanın adı; yol ayırıcılar içeremez.


5

Ayrıca Kotlin ile:

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 ArrayList (value.split(",").map { it.toInt() }) 
}

4

En iyi yolu GSON kullanarak JSOn dizesine dönüştürmek ve bu dizeyi SharedPreference'e kaydetmek. Yanıtları önbelleğe almak için de bu yolu kullanıyorum.


4

Gson kitaplığını kullanarak Dize ve özel dizi listesini kaydedebilirsiniz.

=> Önce dizi listesini SharedPreferences'a kaydetmek için işlev oluşturmanız gerekir.

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 !!!

    }

=> SharedPreferences'den dizi listesi almak için işlev oluşturmanız gerekir.

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

}

=> Kaydet ve dizi listesi işlevini çağırmak için nasıl çağırılır.

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

=> Uygulama düzeyinde build.gradle gson kütüphanesi eklemeyi unutmayın.

'com.google.code.gson: gson: 2.8.2' uygulaması


3

SerializeKey () ve deserializeKey () işlevlerine FacebookSDK'nın SharedPreferencesTokenCache sınıfından başvurabilirsiniz. SupportType öğesini JSON nesnesine dönüştürür ve JSON dizesini SharedPreferences içine depolar . SDK'yı buradan indirebilirsiniz

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

2

Arraylistinizi neden bir Uygulama sınıfına sokmuyorsunuz? Sadece uygulama gerçekten öldürüldüğünde imha edilir , bu yüzden uygulama mevcut olduğu sürece etrafta dolanır.


5
Ya uygulama yeniden başlatılırsa.
Manohar Perepa

2

Bulabildiğim en iyi yol, anahtarların bir 2D Dizisi yapmak ve dizinin özel öğelerini anahtarların 2-D dizisine koymak ve daha sonra başlangıçta 2D dizisi üzerinden almaktır. Ben dize seti kullanma fikrini beğenmedi çünkü android kullanıcılarının çoğu hala Gingerbread üzerinde ve dize seti kullanmak petek gerektirir.

Örnek Kod: burada ditor paylaşılan pref editörü ve rowitem benim özel nesnem.

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

2

Aşağıdaki kod kabul edilen cevaptır, yeni insanlar (ben) için birkaç satır daha, örn. set türü nesnesinin arrayList'e nasıl dönüştürüleceğini ve '.putStringSet' ve '.getStringSet' öğesinden önce neler olduğuna dair ek rehberlik gösterir. (teşekkür ederim 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();

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

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


2

Listeyi dizeye ve tersine dönüştürmek için serileştirmeyi veya Gson kütüphanesini kullanabilir ve ardından dizeyi tercihlere kaydedebilirsiniz.

Google'ın Gson kitaplığını kullanma:

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

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

Java serileştirmeyi kullanma:

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

2

Bu yöntem dizi listesini saklamak / kaydetmek için kullanılır: -

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

Bu yöntem dizi listesini almak için kullanılır: -

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

1

MapDepolamak için bir Nesneye dönüştürebilir , ardından değerleri aldığınızda değerleri bir ArrayList'e dönüştürebilirsiniz SharedPreferences.


1

Bu özel sınıfı kullanın:

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

Nasıl kullanılır:

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

1

bu çalışmalı:

public void setSections (Context c,  List<Section> sectionList){
    this.sectionList = sectionList;

    Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
    String sectionListString = new Gson().toJson(sectionList,sectionListType);

    SharedPreferences.Editor editor = getSharedPreferences(c).edit().putString(PREFS_KEY_SECTIONS, sectionListString);
    editor.apply();
}

sadece yakalamak için:

public List<Section> getSections(Context c){

    if(this.sectionList == null){
        String sSections = getSharedPreferences(c).getString(PREFS_KEY_SECTIONS, null);

        if(sSections == null){
            return new ArrayList<>();
        }

        Type sectionListType = new TypeToken<ArrayList<Section>>(){}.getType();
        try {

            this.sectionList = new Gson().fromJson(sSections, sectionListType);

            if(this.sectionList == null){
                return new ArrayList<>();
            }
        }catch (JsonSyntaxException ex){

            return new ArrayList<>();

        }catch (JsonParseException exc){

            return new ArrayList<>();
        }
    }
    return this.sectionList;
}

benim için çalışıyor.


1

Listesine kaydetmek için utils sınıfım SharedPreferences

public class SharedPrefApi {
    private SharedPreferences sharedPreferences;
    private Gson gson;

    public SharedPrefApi(Context context, Gson gson) {
        this.sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
        this.gson = gson;
    } 

    ...

    public <T> void putList(String key, List<T> list) {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, gson.toJson(list));
        editor.apply();
    }

    public <T> List<T> getList(String key, Class<T> clazz) {
        Type typeOfT = TypeToken.getParameterized(List.class, clazz).getType();
        return gson.fromJson(getString(key, null), typeOfT);
    }
}

kullanma

// for save
sharedPrefApi.putList(SharedPrefApi.Key.USER_LIST, userList);

// for retrieve
List<User> userList = sharedPrefApi.getList(SharedPrefApi.Key.USER_LIST, User.class);

.
Araçlarımın tam kodu // Etkinlik kodunda örneği kullanarak kontrol edin


1

Bir Dize kaydetme ve alma aynı şekilde kullanılır ama burada arrayList ile bir arabulucu olarak HashSet kullandım

ArrayList'i SharedPreferences'a kaydetmek için HashSet kullanırız:

1- SharedPreferences değişkenini yaratırız (dizide değişikliğin gerçekleştiği yerde)

2 - arrayList'i HashSet'e dönüştürüyoruz

3 - sonra stringSet'i koyarız ve uygularız

4 - HashSet içindeSStringSet olsun ve HashSet'i ayarlamak için ArrayList'i yeniden oluşturun.

public class MainActivity extends AppCompatActivity {
    ArrayList<String> 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());
    }
}

0
    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();
        }
    }

0

Yukarıdaki yanıtların hepsi doğrudur. :) Durumum için bunlardan birini kendim kullandım. Ancak soruyu okuduğumda, OP'nin yanlış anlamadıysam, aslında bu yazının başlığından farklı bir senaryodan bahsettiğini buldum.

"Kullanıcı etkinlikten ayrılsa ve daha sonra geri gelmek istese bile dizinin etrafına yapışması gerekiyor"

Uygulamadaki kullanıcı değiştirme ekranlarına bakılmaksızın, verilerin uygulama açılana kadar saklanmasını istiyor.

"Ancak uygulama tamamen kapatıldıktan sonra kullanılabilir dizi gerekmez"

Ancak uygulama kapatıldıktan sonra veriler korunmamalıdır.Bu yüzden SharedPreferencesbunun için en uygun yolun kullanılmadığını hissediyorum .

Bu gereksinim için yapılabilecekler sınıfı genişleten bir sınıf yaratmaktır 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;
    }

}

Ayarlayıcı ve alıcıyı kullanarak ArrayList'e Uygulama bulunan her yerden erişilebilir. Ve en iyi bölüm uygulama kapatıldıktan sonra, depolanan veriler hakkında endişelenmemize gerek yok. :)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.