Comparaison entre textview item et preferenceManager

CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 - 31 janv. 2024 à 16:40
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 - 25 mars 2024 à 11:13

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.


A voir également:

25 réponses

BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
2 févr. 2024 à 15:23

Hello,

Je n'ai pas compris ce que tu cherches à faire.

PreferenceManager te permet de construire un écran de préférences. Quel est le lien avec des TextViews ? Si tu fais référence à un autre écran, il ne faut pas raisonner en composants graphiques (car on affiche un seul écran à la fois, donc l'autre n'est pas créé/persistent) mais plutôt en terme de données...


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
4 févr. 2024 à 11:05

Bonjour Bruno,

j'ai surement mal expliqué mon besoin, je vais essayer d'être plus clair.

1/ je sauvegarde mes données sur Firestore (Collection: générale).

2/ mon recyclerview général est construit grâce à un layout "items".

Ce layout est constitué de plusieurs Textviews.

Je rempli ces TextViews avec les informations récupérées dans la BDD (Collection: générale) Firestore et je crée simultanément une preferenceManager "Code" + "queryDocumentSnapshot.getString(Constants.KEY_SAVE_CODE)"" pour chaque item.

J'espère que tu me suis jusque là?

1/ en cliquant sur un item, l'utilisateur crée une sauvegarde preferenceManager

    public void onItemClicked(User user) {

        double a, b, c;

        a= Double.parseDouble(preferenceManager.getString(Constants.KEY_SAVE_CODE));
        b= Double.parseDouble(preferenceManager.getString(Constants.KEY_GENERAL_CODE));
        c= a+ b;

        int mini = 1;
        int maxi = (int) c;

        for (int i = (mini); i <= (maxi); i++) {

            if (preferenceManager.getString(Constants.KEY_SAVE_CODE+ i).length() < 10) {
                preferenceManager.putString(Constants.KEY_SAVE_CODE+ i, user.uI);
                break;
            } else {

            }
            

        }

2/ lors de l'actualisation du recyclerView général, celui-ci va relire la BDD firestore (Collection: générale) mais je souhaite faire en sorte que les items sélectionnés par l'utilisateur n'apparaissent plus. Du coup je voulais comparer chaque preferenceManager.getString(Constants.KEY_SAVE_CODE) à chaque "item" du recyclerView général.

j'ai essayé de faire au plus simple


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
5 févr. 2024 à 11:26

Hello,

Je pense que tu confonds PreferenceManager et SharedPreferences et je ne vois pas à quoi cela te sert ici...mais je ne dois pas avoir toute la photo.

Si je comprends bien, au refresh de la liste, tu ne dois pas afficher les items précédemment sélectionnés par le user ? Il te faut donc sauver ces items le temps du refresh, c'est bien ça ?


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
5 févr. 2024 à 14:07

Bonjour,

tu as probablement raison, je dois confondre. je te montre ce que j'utilise:

public class PreferenceManager {

    private final SharedPreferences sharedPreferences;


    public PreferenceManager(Context context) {

        sharedPreferences = context.getSharedPreferences(Constants.KEY_PREFERENCE_NAME, 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 clear() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.apply();
    }

}

Tu as bien résumé mon besoin.

Je ne vois à cet instant que les "SharedPreferences" ou "PreferencesManager" pour faire ça.

Tu penses pouvoir m'aider?

Merci par avance.


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
5 févr. 2024 à 14:42

OK. Tu utilises bien les SharedPref. Bon point.

Je pense que le sujet est plus logique que "programmatique". A mon avis, l'algo est le suivant:

- récupération des données de Firestore

- comparaison avec les données locales

- mise à jour des données locales (peut-être pas nécessaire)

- affichage

- mise à jour des données locales

L'idée de stocker les infos dans les SharedPref est une bonne idée, mais tu ne devrais y stocker que les ID à supprimer et non tous les ID des objets.

Quand tu dis

Je rempli ces TextViews avec les informations récupérées dans la BDD (Collection: générale) Firestore et je crée simultanément une preferenceManager "Code" + "queryDocumentSnapshot.getString(Constants.KEY_SAVE_CODE)"" pour chaque item.

je ne suis pas d'accord. Il faudrait juste stocker les ID des items que l'utilisateur sélectionne. De plus, il ne faudrait pas utiliser une entrée par ID mais une entrée qui contient une liste d'ID.

Je te propose de stocker les ID dans une liste sérialisée de cette manière: ID1|ID2|ID3. Je t'ai ajouté 2 méthodes dans ton Manager, une pour ajouter un ID à supprimer, l'autre pour récupérer la liste des ID à supprimer. 

public class PreferenceManager {

    private final SharedPreferences sharedPreferences;
    private const final String DELETE_KEY = "toDelete";
    private const final String DELIMETER = "|";


    public PreferenceManager(Context context) {

        sharedPreferences = context.getSharedPreferences(Constants.KEY_PREFERENCE_NAME, 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);
        IDs += DELIMETER + ID;
        putString(DELETE_KEY, IDs);
    }

    public List<String> getIDArray() {
        String IDs = sharedPreferences.getString(DELETE_KEY, null);
        return Arrays.toString(IDs.split(DELIMETER));
    }

    public void clear() {
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear();
        editor.apply();
    }

}

Je n'ai pas testé, j'ai fait ça à la main, mais tu as l'idée.

Cela te provient-il ? 


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
5 févr. 2024 à 18:08

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.


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
6 févr. 2024 à 09:41

Le getIDArray() te permet de récupérer la liste des ID à supprimer. A utiliser, si j'ai bien compris, avant d'avant tes items, pour voir ce qu'il ne faut pas afficher

0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
6 févr. 2024 à 15:30

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: String

adapt 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?


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
6 févr. 2024 à 16:04

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

0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
6 févr. 2024 à 18:27

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

0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
7 févr. 2024 à 08:57

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


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
23 févr. 2024 à 19:20

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

0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
27 févr. 2024 à 12:24

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


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
28 févr. 2024 à 17:08

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


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
29 févr. 2024 à 09:18

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.


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
29 févr. 2024 à 16:09

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 ?


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
1 mars 2024 à 09:09

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


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
8 mars 2024 à 16:15

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


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
11 mars 2024 à 10:40

dans mon adapter, méthode "setUserData", mais j'ai un "crash" de l'appli.

Quel est le message d'erreur ?


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
11 mars 2024 à 15:00

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

0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
11 mars 2024 à 15:32

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.

0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
11 mars 2024 à 20:14

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?


0
BunoCS Messages postés 15496 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 24 décembre 2024 3 912
Modifié le 12 mars 2024 à 09:28

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

0