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 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 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

CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
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...)

0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 910
15 mars 2024 à 10:48

Tu peux ajouter le mot clé static dans la signature de la méthode

public static List<String> getIDArray() {
    String IDs = sharedPreferences.getString(DELETE_KEY, null);
    return Arrays.toString(IDs.split(DELIMETER));
}
0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
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


0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 910
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. 


0
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
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.


0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 910
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.

0

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

Posez votre question
CR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 1
22 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.


0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 910
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)

0