Comparaison entre textview item et preferenceManager
Bonjour tout le monde,
je souhaite pouvoir faire une comparaison entre un textview de mon recyclerview et une référence préférenceManager afin de savoir si l'item peut être supprimé.
Après plusieurs tentatives je m'en remet à vous.
Q1: Comment désigner un item du RV avec une boucle ?
Q2: Trouver la valeur du textview de l'item sélectionné ?
Q3: Supprimer l'item si textview = preferenceManager ?
Activity.java
private void getUsers() {
loading(true);
FirebaseFirestore database = FirebaseFirestore.getInstance();
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
RecyclerView recyclerView = binding.usersRecyclerView;
recyclerView.setLayoutManager(layoutManager);
recyclerView.setHasFixedSize(true);
List<User> users= new ArrayList<>();
min = preferenceManager.getString(Constants.KEY_MAX);
max = preferenceManager.getString(Constants.KEY_MIN);
for (int i = Integer.parseInt(max); i < Integer.parseInt(min); i++) {
database.collection(preferenceManager.getString(Constants.KEY_G_S))
.document(preferenceManager.getString(Constants.KEY_N_D_S))
.collection(Integer.toString(i))
.get()
.addOnCompleteListener(task -> {
loading(false);
String UI = preferenceManager.getString(Constants.KEY_I);
if (task.isSuccessful() && task.getResult() != null) {
for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) {
if (UI.equals((queryDocumentSnapshot.getId()))) {
continue;
}
User user = new User();
user.i = queryDocumentSnapshot.getString(Constants.KEY_I_P);
user.p = queryDocumentSnapshot.getString(Constants.KEY_P);
user.a = queryDocumentSnapshot.getString(Constants.KEY_A);
user.t = queryDocumentSnapshot.getString(Constants.KEY_T);
user.d = queryDocumentSnapshot.getString(Constants.KEY_D);
user.uI = queryDocumentSnapshot.getString(Constants.KEY_I);
user.to = queryDocumentSnapshot.getString(Constants.KEY_F_TO);
users.add(user);
}
if (users.size() > 0) {
UserAdapter userAdapter = new UserAdapter(users, this);
recyclerView.setAdapter(userAdapter);
recyclerView.setVisibility(View.VISIBLE);
count = Objects.requireNonNull(recyclerView.getAdapter()).getItemCount();
preferenceManager.putString(Constants.KEY_C_N, String.valueOf(count));
showToast(preferenceManager.getString(Constants.KEY_C_N));
}
}
});
}
}
Adapter.java
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {
private final List<User> users;
private final UserListener userListener;
public UserAdapter(List<User> users, UserListener userListener) {
this.users = users;
this.userListener = userListener;
}
@NonNull
@Override
public UserViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemContainerUserBinding itemContainerUserBinding = ItemContainerUserBinding.inflate(
LayoutInflater.from(parent.getContext()),
parent,
false
);
return new UserViewHolder(itemContainerUserBinding);
}
@Override
public void onBindViewHolder(@NonNull UserViewHolder holder, int position) {
holder.setUserData(users.get(position));
}
@Override
public int getItemCount() {
return users.size();
}
class UserViewHolder extends RecyclerView.ViewHolder {
ItemContainerUserBinding binding;
UserViewHolder(ItemContainerUserBinding itemContainerUserBinding) {
super(itemContainerUserBinding.getRoot());
binding = itemContainerUserBinding;
}
void setUserData(User user) {
binding.txtI.setText(user.uI);
}
}
Merci pour votre collaboration.
CR16_Padawan
25 réponses
Comparer le contenu d’un TextView d’un élément RecyclerView avec une référence stockée dans PreferenceManager pour déterminer si l’élément peut être supprimé. Plusieurs réponses évoquent les méthodes pour récupérer les IDs via PreferenceManager, tester des correspondances d’ID et décider de la suppression en s’appuyant sur l’adapter ou le ViewHolder. Des échanges portent sur getIDArray, le passage en static, et le moment où orchestrer la suppression hors de onBindViewHolder pour éviter des crash et des incohérences. En pratique, les propositions envisagent un Adapter séparé, la gestion d’une liste d’ID à supprimer et l’impact sur le réemploi des vues lors des échanges Firestore.
-
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.
-
Modérateur
Hello,
Cool de savoir que cela fonctionne.
Pour la suppression, tu cherches ceci ?
https://developer.android.com/reference/java/util/ArrayList#remove(int)
-
-
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_KEYmais 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_KEYMerci par avance.
-
Modérateur
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.
-
-
Modérateur
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.
-
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 contextdu 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: StringCoté 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
-
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 contextComment 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...)
-
Modérateur
Je te renvoies à la réponse que je t'ai faite en 15: tu dois parcourir ta liste d'ID récupérée et, pour chaque ID, tu dois vérifier si l'ID n'apparait pas dans la liste des ID à supprimer.
Quelques remarques:
min = preferenceManager.getString(Constants.KEY_MAX); max = preferenceManager.getString(Constants.KEY_MIN);
Ici, il y a une inversion, non ?
Tu es sûr de créer au bon endroit ton Adapter ? Il est à l'intérieur d'une boucle, donc à chaque itération, tu vas écraser ce que tu as fait précédemment et tu crée/remplis un adapter et une recyclerView inutilement... Moi, de ma compréhension, je le sortirais de la boucle principale.
Du coup, quelque chose dans ce goût là:
private void getUsers() { loading(true); LinearLayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); List<Count> counts = new ArrayList<>(); min = preferenceManager.getString(Constants.KEY_MAX); // attention, peut-être une inversion max = preferenceManager.getString(Constants.KEY_MIN); for (int i = Integer.parseInt(max); i < Integer.parseInt(min); i++) { database.collection(Constants.KEY_A) .document(Constants.KEY_1) .collection(preferenceManager.getString(Constants.KEY_B)) .document(preferenceManager.getString(Constants.KEY_2)) .collection(Integer.toString(i)).get() .addOnCompleteListener(task -> { loading(false); String currentUserId = preferenceManager.getString(Constants.KEY_USER_ID); if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } Count count = new Count(); count.a = queryDocumentSnapshot.getString(Constants.KEY_a); count.b = queryDocumentSnapshot.getString(Constants.KEY_b); count.c = queryDocumentSnapshot.getString(Constants.KEY_c); count.d = queryDocumentSnapshot.getString(Constants.KEY_d); count.e = queryDocumentSnapshot.getString(Constants.KEY_e); count.f = queryDocumentSnapshot.getString(Constants.KEY_f); count.id = queryDocumentSnapshot.getId(); counts.add(count); } //break; } }); } if (counts.size() > 0) { // Nettoyage de la liste des ID List<Count> listToDisplay = cleanList(counts); // Affichage de la liste des ID nettoyée countAdapter = new CountAdapter(listToDisplay, this, getApplicationContext()); recyclerView.setAdapter(countAdapter); recyclerView.setVisibility(View.VISIBLE); } else { //showErrorMessage(); } } 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; } -
Merci Bruno pour ton soutien.
En ligne 52,
j'ai essayé de ne mettre que:
counts.remove();
mais je ne vois pas comment indiquer dans les parenthéses quel item est à supprimer car "getAdapterPosition()" ne fonctionne pas..
ensuite j'ai voulu faire une comparaison du genre:
int ArrLength = 0; for (String Elements : parte) ArrLength++; for (int j = 0; j < ArrLength; j++) { if (parte[j].equals(?) { counts.remove(??); //break; } else { } } //break; }mais pareil, par quoi dois-je remplacer (?) et (??) pour sélectionner les items à ne pas afficher?
Je suis sûr que la réponse est toute bête.
C'est quoi la différence entre remove(Objects o) et remove(int Index)?
Comment faire le bon choix?
-
Voilà le message erreur:
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 2(offset:2).state:3 androidx.recyclerview.widget.RecyclerView{f7423ea VFE...... ........ 0,0-1080,1963 #7f08028d app:id/usersRecyclerView}, adapter:fr.xx.xxx.adapters.CountAdapter@860c6db, layout:androidx.recyclerview.widget.LinearLayoutManager@62d9578, context:fr.xx.xxx.activities.CountActivity@6b489d4
-
Modérateur
Effectivement, tu essaies de delete un objet alors que tu veux l'afficher...
Il faut que ta liste counts reflète exactement les items à afficher. Ce n'est pas au moment où tu affiches tes objets qu'ils faut les supprimer, il faut le faire avant. Idéalement, avant de passer counts à ton adapter, ligne 52, après ta boucle for.
-
-
Modérateur
dans mon adapter, méthode "setUserData", mais j'ai un "crash" de l'appli.
Quel est le message d'erreur ?
-
bonjour,
voilà où j'en suis.
Je mets mon adapter et ma méthode pour voir ce qu'il reste à faire.
Adapter
package fr.xx.xxx.adapters; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Color; import android.util.Base64; import android.view.LayoutInflater; import android.view.ViewGroup; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; import fr.xx.xxx.databinding.ItemContainerCountBinding; import fr.xx.xxx.listeners.CountListener; import fr.xx.xxx.models.Count; import fr.xx.xxx.utilities.Constants; import fr.xx.xxx.utilities.PreferenceManager; public class CountAdapter extends RecyclerView.Adapter<CountAdapter.CountViewHolder> { private final List<Count> counts; private final CountListener countListener; private final Context context; private PreferenceManager preferenceManager; public CountAdapter(List<Count> counts, CountListener countListener, Context context) { this.counts = counts; this.countListener = countListener; this.context = context; } @NonNull @Override public CountViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { ItemContainerCountBinding itemContainerCountBinding = ItemContainerCountBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); preferenceManager = new PreferenceManager(context); return new CountViewHolder(itemContainerCountBinding); } @Override public void onBindViewHolder(@NonNull CountViewHolder holder, int position) { holder.setUserData(counts.get(position)); holder.setItem(counts.get(position)); } @Override public int getItemCount() { return counts.size(); } private void showToast(String message) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } class CountViewHolder extends RecyclerView.ViewHolder { ItemContainerCountBinding binding; CountViewHolder(ItemContainerCountBinding itemContainerCountBinding) { super(itemContainerCountBinding.getRoot()); binding = itemContainerCountBinding; } void setUserData(Count count) { String totale = preferenceManager.getString(Constants.DELETE_KEY); String[] parte = totale.split(Constants.DELIMETER); int ArrLength = 0; for (String Elements : parte) ArrLength++; for (int i = 0; i < ArrLength; i++) { if (parte[i].equals(count.id)) { binding.txtI.setTextColor(Color.GREEN); binding.txtI.setBackgroundColor(Color.YELLOW); binding.txtb.setText(String.valueOf(getAdapterPosition())); //counts.remove(getAdapterPosition()); break; } else { binding.txtI.setText(count.id); binding.txtP.setText(count.p); binding.txtT.setText(count.tn); binding.txtA.setText(count.a); binding.txtB.setText(String.valueOf(pos)); if (count.img != null) { binding.img.setImageBitmap(getUserImage(count.img)); } binding.txtI.setTextColor(Color.BLUE); binding.txtI.setBackgroundColor(Color.GRAY); } } } public void setItem(Count count) { binding.img1.setOnClickListener(v -> { preferenceManager.addIDToDelete(count.id); deleteItem(getAdapterPosition()); countListener.on1Clicked(count); }); } public void deleteItem(final int position) { counts.remove(position); notifyItemRemoved(position); } private Bitmap getUserImage(String encodedImage) { byte[] bytes = Base64.decode(encodedImage, Base64.DEFAULT); return BitmapFactory.decodeByteArray(bytes, 0, bytes.length); } } }Activity
private void getUsers() { loading(true); LinearLayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); recyclerView.setHasFixedSize(true); List<Count> counts = new ArrayList<>(); min = preferenceManager.getString(Constants.KEY_MAX); max = preferenceManager.getString(Constants.KEY_ MIN); for (int i = Integer.parseInt(max); i < Integer.parseInt(min); i++) { database .collection(Constants.KEY_A .document(Constants.KEY_1) .collection(preferenceManager.getString(Constants.KEY_B)) .document(preferenceManager.getString(Constants.KEY_2)) .collection(Integer.toString(i)).get() .addOnCompleteListener(task -> { loading(false); String currentUserId = preferenceManager.getString(Constants.KEY_USER_ID); if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } Count count = new Count(); count.a = queryDocumentSnapshot.getString(Constants.KEY_a); count.b = queryDocumentSnapshot.getString(Constants.KEY_b); count.c = queryDocumentSnapshot.getString(Constants.KEY_c); count.d = queryDocumentSnapshot.getString(Constants.KEY_d); count.e = queryDocumentSnapshot.getString(Constants.KEY_e); count.f = queryDocumentSnapshot.getString(Constants.KEY_f); count.id = queryDocumentSnapshot.getId(); counts.add(count); } //break; } if (counts.size() > 0) { countAdapter = new CountAdapter(counts, this, getApplicationContext()); recyclerView.setAdapter(countAdapter); recyclerView.setVisibility(View.VISIBLE); } else { //showErrorMessage(); } }); } }J'ai utiliser la coloration pour savoir quel(s) item(s) étai(en)t concerné(s) par la suppression. Le résultat est satisfaisant. Maintenant comment faire pour "supprimer" ces items ?
J'ai essayé d'utiliser:
counts.remove(getAdapterPosition());dans mon adapter, méthode "setUserData", mais j'ai un "crash" de l'appli.
D'après mes recherches, il faudrait que je sois en dehors du "onBindViewHolder" pour faire la suppression des items.
Je sens que je ne suis pas loin de ce que je veux mais je bloque sur la finalisation.
Merci pour votre soutient et vos proposions.
Cordialement
-
Modérateur
Comment rafraichir mon recyclerView ?
Est-ce qu'il faudrait le vider intégralement et le reconstruire à chaque fois ?
C'est effectivement mieux, oui, si tu n'as pas des centaines d'items
-
cc,
oui ça me parait etre bien placé.
j'ai fais quelques tests mais je n'obtient pas le résultat escompté.
Mon adapter:
@Override public void onBindViewHolder(@NonNull CountViewHolder holder, int position) { holder.setUserData(counts.get(position)); }void setUserData(Count count) { binding.txt1.setText(count.x); binding.txt2.setText(count.xx); binding.txt3.setText(count.xxx); binding.txt4.setText(count.xxxx); binding.txt5.setText(count.xxxxx); }public void deleteItem(final int position) { counts.remove(position); notifyItemRemoved(position); }public void setItem(Count count) { //... binding.imgxxx.setOnClickListener(v -> { preferenceManager.addIDToDelete(count.id); deleteItem(getAdapterPosition()); countListener.onxxxClicked(count); }); //... }mon activity:
private void getUsers() { //... String totale = preferenceManager.getString(Constants.DELETE_KEY); String[] parte = totale.split(Constants.DELIMETER); //... //Récupération des données via Firebase ... count.id = queryDocumentSnapshot.getId(); int ArrLength = 0; for (String Elements : parte) ArrLength++; for (int j = 0; j < ArrLength; j++) { if (parte[j].equals(count.id) || count.id == null) { break; }else { counts.add(count); } } } //break; } if (counts.size() > 0) { CountAdapter countAdapter = new CountAdapter (counts, this, getApplicationContext()); recyclerView.setAdapter(CountAdapter ); recyclerView.setVisibility(View.VISIBLE); } else { //showErrorMessage(); } }); } }Mon app à plusieurs activités de navigations. Lorsque je vais de l'une à l'autre et reviens sur cette activité, l'affichage n'est pas du tout conforme à mes attentes. J'ai parfois 2 fois le même item et même ceux qui ne doivent pas être affichés.
J'avais pensé mettre le "OnResume" mais ça ne fonctionne pas non plus.
Comment rafraichir mon recyclerView ?
Est-ce qu'il faudrait le vider intégralement et le reconstruire à chaque fois ?
-
Modérateur
La comparaison est au bon endroit il me semble. Par contre, ta condition n'est pas correcte. Là, tu es en train de comparer un tableau avec une valeur, ça ne fonctionnera pas (d'ailleurs, pas sûr que cela compile).
Ce qui faut faire:
- création d'une variable temporaire contenant les ID à afficher. counts si je comprends bien
- pour chaque ID que tu as récupéré
- voir si cet ID est présent dans les pref (*)
- s'il est présent, tu sautes au suivant
- s'il n'est pas présent, tu l'ajoutes à counts
- une fois le traitement fini, tu passes counts à ton Adapter
(*) ici, pas de miracles. Il te faut boucler sur le tableau d'ID (donné par getIDArray) et voir si l'ID est présent.
-
Hello,
bon je progresse doucement.
j'arrive à créer ma liste avec
"preferenceManager.addIDToDelete(param);"
et l'afficher avec
"preferenceManager.getString(Constants.DELETE_KEY);"
dans un textView (juste pour voir ce qu'elle contient).
Je constate qu'elle est constituée ainsi
id1_id2_id3_... etc
mon objectif est de pouvoir comparer
id1 avec TOUS les items du recyclerView afin de ne pas l'afficher si nécessaire et ainsi de suite avec les autres id de la liste, mais comment faire?
voilà ce que je fais:
private void getUsers() { //… if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } //Récupération des infos sur Firestore via count.name = queryDocumentSnapshot.getString(…) } } } //comparaison pour suppression if (preferenceManager.getIDArray().equals((count.id))) { showToast("Supression Ok!!"); } counts.add(count); } //break; } if (counts.size() > 0) { CountAdapter countAdapter = new CountAdapter(counts, this, getApplicationContext()); recyclerView.setAdapter(countAdapter); recyclerView.setVisibility(View.VISIBLE); } else { showErrorMessage(); } }); } }Peux-tu me dire si je place bien ma comparaison ou s'il faut que je passe par l'adapter?
Est-ce que ce code permet une lecture individuelle de chaque id ?
public String[] getIDArray() { String IDs = sharedPreferences.getString(Constants.DELETE_KEY, null); return IDs.split(Constants.DELIMETER); }Après réflexion je me demande si il ne vaux pas mieux utiliser
preferenceManager.getString(Constants.DELETE_KEY)Si tu as besoin de voir certaines choses, demande.
Merci par avance
-
Modérateur
Hello,
Je ne vois pas où est-ce que tu construis ta RecyclerView, ni quel Adapter tu utilises... ll faut:
- récupérer la liste du Firestore
- mettre à jour cette liste avec les infos stockées dans les prefs
- construire l'Adapter
- construire la RecyclerView
-
Bonjour,
désolé de revenir si tardivement mais j'ai dû faire un petit break.
j'ai repris mon projet et malgré plusieurs tentatives pour utiliser la liste des ids je n'y suis pas parvenu.
j'ai donc bricolé un peu mon programme et je suis à 1 cheveux de réussir ce que je veux faire mais BIM un problème!!!
j'enregistre mes ids de cette manière:
for (int i = 0; i <= somma; i++) { if (preferenceManager.getString(Constants.KEY_USER + i) == null || preferenceManager.getString(Constants.KEY_USER + i).length() < 10) { preferenceManager.putString(Constants.KEY_USER + i, count.id); preferenceManager.putString(Constants.KEY_USER_NUM, String.valueOf(i + 1)); break; } else { } }Ne me gronde pas STP Bruno.
ensuite je les utilise dans mon recyclerview comme ça:
private void getUsers() { //… if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } for (int j = 0; j <= somma ; j++) { String userId = preferenceManager.getString(Constants.KEY_USER + j); if (queryDocumentSnapshot.getId().equals((userId))) { break; } else { //Récupération des infos sur Firestore via //count.name = queryDocumentSnapshot.getString(…) counts.add(count) ; break; } } } if (counts.size() > 0) { CountAdapter countAdapter = new CountAdapter(counts, this, getApplicationContext()); recyclerView.setAdapter(countAdapter); recyclerView.setVisibility(View.VISIBLE); } else { showErrorMessage(); } } else { showErrorMessage(); } preferenceManager.putString(Constants.KEY_COUNT_NUM, String.valueOf(counts.size())); somma = userNum + counts.size() + 1; });j'ai fait un test avec 2 ids et quand je supprime les 2, j'ai bien l'enregistrement des ids dans preferenceManager mais au Refresh du recyclerview il me reste toujours un Id visible.
1/ où se situe mon erreur et comment y remédier?
2/ peux tu me montrer, stp, comment utiliser ta liste dans mon code ?
J'ai émis l'hypothèse de pouvoir passer par l'adapter mais sans succès.
Merci d'avance
CR16_Padawan
-
Modérateur
Je vais répondre dans le sens contraire des questions ;)
Tu peux changer le délimiteur sans souci, il faut juste s'assurer que tu ne le retrouveras pas dans tes ID.
Qu'entends-tu par "utiliser individuellement" ? Normalement, getIDArray() te retourne la liste des ID stockés: ["ID1","ID2","ID3",...]
Enfin, pour des raisons logiques et visuelles, il faut faire le nettoyage avant l'affichage
-
Merci pour la correction.
Questions bête:
Dois-je faire une boucle dans "getUsers" (message:1) avec "getIDArray" pour comparer avec mes Items ou alors remplir mon recyclerView et après faire la suppression des Items en trop?
Comment utiliser individuellement les id stockés?
Ne va t-il pas y avoir un problème avec le "DELIMETER" si je ne les extrait pas?
CR16_Padawan
-
Bonjour,
j'ai un probléme avec getIDArray.
return Arrays.toString(IDs.split(Constants.DELIMETER));est souligné en rouge, Il est indiqué:
Required type: List<java.lang.String>
Provided: Stringadapt using: Collections.singletonList()
J'ai mis getIDArray juste avant d'appeler mon getUsers (qui rempli mon recyclerview) dans le onCreate, mais je ne vois pas comment cela peut supprimer les items enregistrés dans la liste?
-
Modérateur
Tu peux corriger comme suit:
public String[] getIDArray() { String IDs = sharedPreferences.getString(DELETE_KEY, null); return IDs.split(DELIMETER)); }Par contre, cela ne supprimes pas, ça te donne juste la liste des ID stockés. Ensuite, à toi de parcourir cette liste pour faire les actions nécessaires
-
-
re,
j'ai apporté tes modifs et je parviens à utiliser "addIDToDelete" pour alimenter "DELETE_KEY" et supprimer l'Item du recyvlerView.
Par contre je ne comprends pas bien comment faire avec getIDArray.
public void onItemClicked(User user) { preferenceManager.addIDToDelete(user.ui); preferenceManager.getIDArray(); }Je ne suis pas sûr de son emplacement.
- 1
- 2