2017-09-29 3 views
0

J'ai fait une application simple avec une vue de recyclage dans un fragment. En OnCreateView je reçois une liste de SharedPreferences (d'une classe séparée), puis je l'enregistrer dans une liste privée comme ceci:Liste modifiée après SharedPreferences.commit

mModel = AnotherClass.GetListFromSharedPreferences(); 

Le problème est quand j'essaie d'ajouter un élément à la RecyclerView (et SharedPreferences) en cliquant sur un bouton. Ceci est mon code lorsque le bouton est pressé:

AnotherClass.saveInSharedPreferences(itemAdded); 
mModel.add(ItemAdded); 

saveInSharedPreferences obtenir la liste enregistrée de SharedPreferences:

public boolean saveInSharedPreferences(@NonNull final Item item) { 
    List<item> currentSaved = GetListFromSharedPreferences(); 
    if (currentSaved.size() == 0) { 
     currentSaved = new LinkedList<>(); 
    } 
    currentSaved.add(item); 
    mCache = currentSaved ; 
    return save(); 
} 

Et il appelle la méthode de sauvegarde, qui sauvegarde la liste éditée dans SharedPreferences:

private boolean save() { 
    if (mCache != null) { 
     try { 
      final JSONArray array = new JSONArray(); 
      for (Item item : mCache) { 
       JSONObject item = item.toJson(); //Just put everthing in a JSON Object 
       array.put(item); 
      } 
      final String arrayAsString = array.toString(); 
      mSharedPreferences.edit().putString(KEY, arrayAsString).apply(); 
      return true; 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      return false; 
     } 
    } 
    return false; 
} 

Cela fonctionne correctement (il ajoute le nouvel élément dans SharedPreferences), mais après l'appel de cette méthodes, semble que mon mModel a déjà ajouté le nouvel élément! Avant d'appeler le mModel.add. Puisque OnCreateView est appelé juste 1 fois quand j'appelle le fragment, et que le mModel est valorisé seulement dans ce temps, je ne vois pas comment est-il possible que mon mModel soit modifié juste après avoir édité mes SharedPreferences ...?

+0

Ajouter plus de code. Le code ajouté n'a pas grand chose à voir. – codeFreak

+0

Ajout des deux seules méthodes appelées – FeFe

Répondre

1

pour écouter les éléments nouvellement ajoutés utiliser registerOnSharedPreferenceChangeListener il gardera appelé lorsque les éléments ajoutés

utiliser sur onCreateView

SharedPreference.registerOnSharedPreferenceChangeListener (SharedPreferences.OnSharedPreferenceChangeListener listener) 
+0

Mais je ne comprends tout simplement pas pourquoi ma liste mModel est modifiée après ces instructions ... – FeFe

+0

Je pense que la référence mModel est partagée avec recyclerAdapter dataListArray. –

+0

Je pense que vous avez raison, mModel change si je change les SharedPreferences, changé de mModel = AnotherClass.GetListFromSharedPreferences(); À mModel = new LinkedList <> (AnotherClass.GetListFromSharedPreferences()); Et ça marche, merci – FeFe