Comparaison entre textview item et preferenceManager
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 - 25 mars 2024 à 11:13
- Comparaison entre textview item et preferenceManager
- Comparaison million milliard - Accueil - Technologies
- Logiciel comparaison photo gratuit - Télécharger - Photo & Graphisme
- Comparaison prix amazon - Accueil - Commerce
- Item returned from customs traduction - Forum Consommation & Internet
- The item is ready for shipment postnl - Forum Consommation & Internet
25 réponses
14 mars 2024 à 18:52
Bonsoir Bruno,
merci pour ta réponse. Effectivement mon approche n'était pas tout à fait la même. Je rencontre un petit souci avec
Arrays.asList(PreferenceManager.getIDArray());
getIDArray()
est souligné en rouge et on m'indique ceci:
Non-static method 'getIDArray()' cannot be referenced from a static context
Comment résoudre?
Si je lance l'appli voici le message d'erreur:
equality constraints: Count
lower bounds: String
where T is a type-variable:
T extends Object declared in method <T>asList(T...)
17 mars 2024 à 19:51
Bonjour Bruno,
j'ai fait la modif mais ça ne marche pas. j'ai tenté de trouver une solution mais les explications trouvées ne sont pas très claires.
Ce que j'ai fait dans:
PreferencesManager.java:
public static List<String> getIDArray() { String IDs = sharedPreferences.getString(Constants.DELETE_KEY, null); return Arrays.toString(IDs.split(Constants.DELIMETER)); }
mais
sharedPreferences
s'est écrit en rouge et j'ai eut ce message
Non-static field 'sharedPreferences' cannot be referenced from a static context
du coup j'ai modifier comme suit la déclaration de "SharedPreferences:
private final SharedPreferences sharedPreferences;
en
private static SharedPreferences sharedPreferences = null;
Cela n'affectera t-il pas le reste de mon programme?
De plus la ligne
return Arrays.toString(IDs.split(Constants.DELIMETER));
est soulignée en rouge et il y a ce message
Required type: List <java.lang.String>
Provided: String
Coté CountActivity.java
private List<Count> cleanList(List<Count> listToClean) { List<Count> result = new ArrayList<>(); List<Count> listToDelete = Arrays.asList(PreferenceManager.getIDArray()); for (Count count: listToClean) { if (!listToDelete.contains(count.id)) { result.add(count); } } return result; }
Arrays.asList(PreferenceManager.getIDArray());
est souligné en rouge avec ce message
Required type: List <Count>
Provided: List <List<String>>
no instance(s) of type variable(s) exist so that List<String> conforms to Count inference variable T has incompatible bounds: equality constraints: Count lower bounds: List<String>
Je n'y comprends rien.
Pourrais-tu m'expliquer s'il te plaît?
cordialement
18 mars 2024 à 10:06
Hello,
J'ai pris le temps de faire quelques tests et, effectivement, j'avais fait quelques boulettes.
Au niveau du PreferenceManager, je change le délimiteur et les méthodes addToDelete() et getIDArray() :
public class PreferenceManager { private final SharedPreferences sharedPreferences; private final String DELETE_KEY = "toDelete"; private final String DELIMETER = ";"; public PreferenceManager(Context context) { sharedPreferences = context.getSharedPreferences("prefs", Context.MODE_PRIVATE); } public void putBoolean(String key, Boolean value) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putBoolean(key, value); editor.apply(); } public Boolean getBoolean(String key) { return sharedPreferences.getBoolean(key, false); } public void putString(String key, String value) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(key, value); editor.apply(); } public String getString(String key) { return sharedPreferences.getString(key, null); } public void addIDToDelete(String ID) { String IDs = sharedPreferences.getString(DELETE_KEY, null); if (IDs == null) { IDs = ID; } else { IDs += DELIMETER + ID; } putString(DELETE_KEY, IDs); } public String[] getIDArray() { String IDs = sharedPreferences.getString(DELETE_KEY, null); return IDs.split(DELIMETER); } public void clear() { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); editor.apply(); } }
Au niveau de l'utilisation, voici un code de test. Je pense que tu arriveras à l'adapter à ton besoin :
// Ici, je créé listToClean, qui est la liste que tu récupères du Firestore List<String> listToClean = new ArrayList<>(); listToClean.add("ID_1"); listToClean.add("ID_2"); listToClean.add("ID_3"); listToClean.add("ID_4"); listToClean.add("ID_5"); // Ici, j'initialise mon PreferenceManager. C'est ce que tu fais dans ta RecyclerView et/ou Adapter PreferenceManager prefs = new PreferenceManager(getContext()); prefs.clear(); prefs.addIDToDelete("ID_2"); prefs.addIDToDelete("ID_4"); // Je récupère la liste des ID à supprimer List<String> listToDelete = Arrays.stream(prefs.getIDArray()).collect(Collectors.toList()); // Pour chaque item présent dans la liste listToClean // Je regarde s'il n'est pas dans la liste des ID à supprimer // Si ce n'est pas le cas, je le stocke dans result, qui te servira à remplir la RecyclerView List<String> result = new ArrayList<>(); for (String str : listToClean) { if (!listToDelete.contains(str)) { result.add(str); } }
J'espère que cela t'aidera à y voir plus clair.
18 mars 2024 à 17:33
Bonsoir Bruno,
merci pour cette belle avancée. j'ai adapté et testé mais j'ai encore besoin de tes conseils.
1/ Je n'ai pas bien compris l'utilisation de:
prefs.clear();
prefs.addIDToDelete("ID_2");
ni où vraiment le placer.
2/ J'ai dû utiliser cette condition:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { listToDelete = Arrays.stream(preferenceManager.getIDArray()).collect(Collectors.toList()); }
pourquoi? Y a t-il une MaJ à faire de "Android Studio" ou dans build.gradle.kts(Module:app) ?
3/ Le test a fonctionné lorsque j'avais encore des "Ids" dans :
Constants.DELETE_KEY
mais pour tester le fonctionnement à vide j'ai fais un Reset avec ceci :
public void remove(String key) { SharedPreferences.Editor editor = sharedPreferences.edit(); editor.remove(key); editor.apply(); }
et depuis mon appli "Crash" et le Logcat me renvoi vers PreferenceManager à la ligne
return IDs.split(Constants.DELIMETER);
Q: Quand on fait "Remove", cela remet bien la valeur "null" dans
Constants.DELETE_KEY
Merci par avance.
19 mars 2024 à 11:22
1. Tu n'en a pas besoin. C'était juste pour moi pour initialiser ma liste dans les Prefs
2. Mince, cela veut dire que ton app ne fonctionnera pas pour des Android avec une version < Android N (7.0). Si tu veux cibler des versions inférieures, il faut trouver une autre manière de transformer un String[] en ArrayList<String>. Une simple boucle peut faire l'affaire
3. Ta méthode remove() supprime la clé que tu passes en paramètres des preferences. Tu ne peux donc plus y accéder. Si tu veux vider la valeur, il faut faire un clear(), comme je l'ai fait au point 1.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question22 mars 2024 à 17:05
Bonjour Bruno,
Après quelques tests, le résultat me paraît être très satisfaisant.
Merci beaucoup pour tout le travail que tu as effectué pour m'aider à avancer.
Si je peux me permettre, imaginons que je veuille supprimer un Id de la liste
List<String> listToDelete = Arrays.stream(prefs.getIDArray()).collect(Collectors.toList());
comment dois-je procéder?
Cette liste est utiliser pour remplir une autre RecyclerView.
Modifié le 25 mars 2024 à 11:14
Hello,
Cool de savoir que cela fonctionne.
Pour la suppression, tu cherches ceci ?
https://developer.android.com/reference/java/util/ArrayList#remove(int)
15 mars 2024 à 10:48
Tu peux ajouter le mot clé static dans la signature de la méthode