ListView item spécifique en gras

Résolu/Fermé
Joker_ Messages postés 173 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 - Modifié le 26 sept. 2018 à 08:57
Joker_ Messages postés 173 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 - 27 sept. 2018 à 16:19
Bonjour,
Mon projet est d'afficher la liste des messages reçue par l'utilisateur dans un ListView (j'ai les stocké dans un JSONArray:
  JSONArray values = jsonObject.getJSONArray("message");
                int code_msg = 0, lu = 0;
                String message = "", object = "", date_msg = "";
                boolean trouve = false;
                String array_String[]= new String[values.length()];
                Message array_messages[]= new Message[values.length()];// Message est une class que j'ai définit
                Message message_object;
                for (int i = 0; i < values.length(); i++) {
                    trouve = true;
                    JSONObject message_ = values.getJSONObject(i);
                    code_msg = message_.getInt("code_msg");
                    message = message_.getString("message");
                    object = message_.getString("object");
                    date_msg =message_.getString("date_msg");
                    lu = message_.getInt("lu");
                    message_object=new Message( message,  object,  date_msg,  lu,  code_msg);
                    array_messages[i]=message_object;
                    array_String[i]=array_String+" "+date_msg;
                }
                ArrayAdapter<String> adapter =new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,array_String);
                listeMessages.setAdapter(adapter);
    if(trouve==false)
     txtResultat.setText("Boite reception vide!! ");


Tous ça marche bien...la liste des messages est bien affiché dans la ListView(listeMessages)

Je veux maintenant améliorer mon projet par le fait d'afficher en gras les messages non lu ( int lu=> 0: c.a.d non lu et 1 : c.a.d lu)
En faite je doit parcourir le array_messages par une boucle for pour savoir quelles sont les messages non lu ainsi faire la modification nécessaires dans mon ListView listeMessages
Alors j'ai ajouté ce code:
                for (int i = 0; i < array_messages.length; i++) {
                  lu=  array_messages[i].getLu();
                    if(lu==0) {
                      ((TextView)listeMessages.getChildAt(i)).setTypeface(null, Typeface.BOLD);
                    }
                }


Mon problème est une exception lancée lors de l'exécution de l'application:
method void android.widget.TextView.setTypeface(android.graphics.Typeface,int) on a null object reference

Qu'est ce je dois faire pour éviter cette exception!!???


4 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
26 sept. 2018 à 08:58
Bonjour,

Il faut que tu implémentes ton propre adapter avec ton propre layout
1
Joker_ Messages postés 173 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
Modifié le 26 sept. 2018 à 10:22
Etes vous sure BunoCS!!?? J'ai testé l'instruction

((TextView)listeMessages.getChildAt(i)).setTypeface(null, Typeface.BOLD)

dans la fonction listeMSG.setOnItemClickListener avec i dépend de position et getFirstVisiblePosition et ca marche sans exception???
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
26 sept. 2018 à 10:41
Oui, je suis sûr.
Ce que tu veux faire n'est pas propre. De plus, tu as une exception car potentiellement, tu essaies d'accéder à un composant qui n'est pas visible, donc qui n'existe pas. Par exemple, si le message n°1000 n'est pas lu, tu ne peux pas accéder à sa TextView car l'élément à la position 1000 n'a pas été créé.
Tu trouveras un tuto ici: https://www.journaldev.com/10416/android-listview-with-custom-adapter-example-tutorial
0
Joker_ Messages postés 173 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
26 sept. 2018 à 04:32
Quelqu'un peut me donner des conseilles svp!!!???
0
Joker_ Messages postés 173 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
27 sept. 2018 à 12:31
Bonjour BunoCs, merci pour la réponse

J'ai bien lu votre exemple et je l'ai appliqué a mon projet... maintenant je peux prendre le contrôle a n'importe quelle ligne de ma listeMSG

MyListAdapter adapter = new MyListAdapter(this, R.layout.my_custom_list, messagesList);

//attaching adapter to the listMSG
listMSG.setAdapter(adapter);
Message m = adapter.getItem(5);
m.object="Je remplace l'objet du message num 5";
View v=adapter.getView(5,null,listMSG);
((TextView)v.findViewById(R.id.textViewObject)).setTypeface(null, Typeface.BOLD_ITALIC);
Toast.makeText(getApplicationContext(),((TextView)v.findViewById(R.id.textViewObject)).getText(),2).show();
adapter.notifyDataSetChanged();

Le text de l'élément numéro5 est bien changé (Indication Toast) mais le Typeface bold et italic que j'ai choisit n'est pas appliqué dans l'affichage de mon listMSG..
??!!!!!!
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
27 sept. 2018 à 13:05
adapter.notifyDataSetChanged();
va te recharger ta liste à partir de ton modèle. Il faut modifier le modèle en mettant tel message à "lu" et, à l'intérieur de ton adapter, dans la méthode
getView()
mettre ton texte en gras
0
Joker_ Messages postés 173 Date d'inscription mardi 13 octobre 2009 Statut Membre Dernière intervention 20 janvier 2023 1
27 sept. 2018 à 16:19
Ok c'est bon problème résolue!!!!

Merci beaucoup!!@BunoCS
0