Boucle sur firestore possible?
RésoluBunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 - 5 janv. 2024 à 09:20
6 réponses
3 janv. 2024 à 15:30
Bonjour à toutes et à tous et bonne année,
j'ai tenté un test qui me parait être bon mais toutes les données ne s'affichent pas dans le recyclerView.
private void getUsers() { //loading(true); initIdentifiant(); FirebaseFirestore database = FirebaseFirestore.getInstance(); for (int i = 10; i < 20; i++) { int ym = i; database.collection(Constants.KEY_COLLECTION_X) .document("01") .collection(String.valueOf(ym)) .get() .addOnCompleteListener(task -> { //loading(false); String currentUserId = userId; if (task.isSuccessful() && task.getResult() != null) { List<User> users = new ArrayList<>(); for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } User user = new User(); user.ident = queryDocumentSnapshot.getString(Constants.KEY_1); user.pseudo = queryDocumentSnapshot.getString(Constants.KEY_2); user.email = queryDocumentSnapshot.getString(Constants.KEY_3); user.password = queryDocumentSnapshot.getString(Constants.KEY_4); user.image = queryDocumentSnapshot.getString(Constants.KEY_IMG_5); user.token = queryDocumentSnapshot.getString(Constants.KEY_6); user.id = queryDocumentSnapshot.getId(); users.add(user); showToast("Boucle effectuée sur: " + ym); } if (users.size() > 0) { UsersAdapter usersAdapter = new UsersAdapter(users, this); binding.usersRecyclerView.setAdapter(usersAdapter); binding.usersRecyclerView.setVisibility(View.VISIBLE); } else { //usersAdapter.notifyDataSetChanged(); //showErrorMessage(); } } else { //showErrorMessage(); } }); } }
lorsque je lance le test j'ai une boucle qui se fait sur le bon nombre de documents présents dans Firestore en l'occurrence pour ce test (2)
ex: ym = 12 et ym = 17
Seul le résultat de la première boucle est affiché.
Comment faire pour que TOUS les autres résultats trouvés sur Firestore soient combinés au premier?
J'espère avoir été clair... désolé c'est encore le début de l'année.
Merci par avance.
4 janv. 2024 à 09:15
Hello,
Il y a certaines choses que je ne comprends pas:
- pourquoi boucles-tu entre 10 et 20 ?
- ym n'a pas d'utilité car il a la même valeur que i
- tu as une boucle dans une boucle: pour chaque i, ou ym, tu as une liste de users avec laquelle tu récrées un adapter. Donc à chaque tour de boucle, et si tu as des users, ta RecyclerView se vide.
Est-ce que tu cherches à faire ?
4 janv. 2024 à 14:04
Bonjour Bruno et encore merci de te pencher sur mon problème.
pour répondre à tes questions:
- 10 et 20 sont des exemples, ils seront remplacés par une variable déjà établi dans mon projet,
- pour "ym" je me suis rendu compte de mon ânerie après avoir posté ce message, désolé
- c'est sur ce point précis que je bute.
En fait, à chaque bouclage "ym" je récupère les différents "users" qu'il contient et que je veux charger dans mon recyclerView.
ex:
boucle 1: ym=10 avec 3 users dedans et je les affiche dans le recyclerview.
boucle 2: ym=11 avec 0 users dedans, étant donné que le résultat est nul je passe au bouclage suivant sans supprimer ou vider le recyclerView
boucle 3: ym=12 avec 0 users également, donc idem à boucle 2
boucle 4: ym=13 avec 1 users dedans, j'ajoute donc ce résultat aux bouclages précédents pour pouvoir voir le résultat cumulé de la boucle 1 à celle-ci
boucle 5: ym=14 avec 5 users dedans, je veux pouvoir voir le résultat cumulé de la boucle 1 à celle-ci
et ainsi de suite jusqu'à la borne max (ici 20 pour l'exemple).
J'ai essayé différentes façons de faire mais je n'y arrive pas j'ai toujours le résultat de la boucle 1 uniquement.
Comment dois-je procéder pour initialiser le contenu de mon recyclerView de la manière que j'ai expliqué?
J'espère que mon explication est plus clair.
Merci d'avance
4 janv. 2024 à 15:48
Si ta liste users doit être remplie après chaque itération de ym, il faut que tu la sortes de ta boucle principale. Idem pour la création de ton adapter. Quelque chose dans ce goût là
private void getUsers() { //loading(true); initIdentifiant(); FirebaseFirestore database = FirebaseFirestore.getInstance(); List<User> users = new ArrayList<>(); for (int i = 10; i < 20; i++) { int ym = i; database.collection(Constants.KEY_COLLECTION_X) .document("01") .collection(String.valueOf(ym)) .get() .addOnCompleteListener(task -> { //loading(false); String currentUserId = userId; if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } User user = new User(); user.ident = queryDocumentSnapshot.getString(Constants.KEY_1); user.pseudo = queryDocumentSnapshot.getString(Constants.KEY_2); user.email = queryDocumentSnapshot.getString(Constants.KEY_3); user.password = queryDocumentSnapshot.getString(Constants.KEY_4); user.image = queryDocumentSnapshot.getString(Constants.KEY_IMG_5); user.token = queryDocumentSnapshot.getString(Constants.KEY_6); user.id = queryDocumentSnapshot.getId(); users.add(user); showToast("Boucle effectuée sur: " + ym); } } else { //showErrorMessage(); } }); } if (users.size() > 0) { UsersAdapter usersAdapter = new UsersAdapter(users, this); binding.usersRecyclerView.setAdapter(usersAdapter); binding.usersRecyclerView.setVisibility(View.VISIBLE); } else { //usersAdapter.notifyDataSetChanged(); //showErrorMessage(); } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question5 janv. 2024 à 00:04
Bonsoir Bruno,
merci pour ton retour. Aprés quelques modifications j'ai trouvé la solution que j'attendais.
voici ce que j'ai fait :
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<>(); for (int ym = 10; ym < 20; ym ++) { database.collection(Constants.KEY_COLLECTION_X) .document("01") .collection(String.valueOf(ym)) .get() .addOnCompleteListener(task -> { //loading(false); String currentUserId = userId; if (task.isSuccessful() && task.getResult() != null) { for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) { if (currentUserId.equals((queryDocumentSnapshot.getId()))) { continue; } User user = new User(); user.ident = queryDocumentSnapshot.getString(Constants.KEY_1); user.pseudo = queryDocumentSnapshot.getString(Constants.KEY_2); user.email = queryDocumentSnapshot.getString(Constants.KEY_3); user.password = queryDocumentSnapshot.getString(Constants.KEY_4); user.image = queryDocumentSnapshot.getString(Constants.KEY_IMG_5); user.token = queryDocumentSnapshot.getString(Constants.KEY_6); user.id = queryDocumentSnapshot.getId(); users.add(user); showToast("Boucle effectuée sur: " + ym); } if (users.size() > 0) { UsersAdapter usersAdapter = new UsersAdapter(users, this); recyclerView.setAdapter(usersAdapter); recyclerView.setVisibility(View.VISIBLE); } else { //showErrorMessage(); } } else { //showErrorMessage(); } }); } }
Depuis mon code d'origine j'ai déplacé la ligne
"List<User> users = new ArrayList<>();"
juste avant le bouclage.
Merci encore pour tout le temps passé à m'aider.
Peut être à bientôt pour de nouvelles aventures.
Cordialement;
PS: as-tu des connaissances dans les notifications push?
probleme-avec-notification-push-androidstudio
5 janv. 2024 à 09:20
Cool ! Content que tu aies trouvé la solution à ton problème. On peut donc passer ce topic en résolu ?
J'ai déjà intégré des notifications push, oui. Comme dit dans mon message, généralement, le service que tu choisis fournit une doc d'intégration. Mais n'hésites pas à compléter ton problème sur le sujet concerné.