Modifier couleur de fond d'un élément ListView

Fermé
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020 - Modifié le 5 mars 2020 à 11:11
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020 - 16 mars 2020 à 16:54
Salut à tous,

Je suis débutant avec Android studio 3.6, j'alimente une ListView avec le contenu que j'ai mis dans liste_joueursafficheecol1:

mListView = (ListView) findViewById(R.id.listView);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(TirageAuSortActivity.this,
android.R.layout.simple_list_item_1, liste_joueursafficheecol1);
mListView.setAdapter(adapter);


Je voudrais juste après modifier le Backgrouncolor de l'item 1 avec du code style
mListView.getChildAt(0).setBackgroundColor(Color.CYAN);


Ca plante, vous voyez pourquoi ?

merci bien.

EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.
A voir également:

12 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
5 mars 2020 à 11:17
Bonjour,

Ce n'est pas une bonne manière de faire... Si tu veux personnaliser tes items, il faut que tu crée un adapter perso, du genre ceci :

class MyAdapter extends ArrayAdapter<String> {
     View getView(int position, View convertView, ViewGroup parent) {
          View v = super.getView(position, convertView, parent);
          if (position == 0) {
              v.setBackgroundColor(Color.CYAN);
          } else {
             v.setBackgroundColor(Color.WHITE);
          }
          return v;
     }
} 


Note : j'ai modifié ta demande pour ajouter les balises code et gagner en lisibilité. Plus d'infos dans l'encart ;)
0
merci pour ta réponse mais j'ai déjà codé ça car si je clique sur un item je change sa couleur de fond et là ça fonctionne nickel mais mon problème n'est pas là. Je voudrais modifier la couleur de fond d'un item dans du code sans que l'utilisateur clique dessus, peut-être en appelant cet adapter perso que j'ai déjà ? si oui comment le déclencher et avec quels paramètres ?
merci.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
5 mars 2020 à 14:30
Tu mélanges ItemClickListener et Adapter...Ce n'est pas la même chose ;)
L'Adapter "adapte" la vue par rapport aux données. Le ItemClickListener répond à l'évènement onItemClick()
0
donc je ne peux changer la couleur de fond de l'item de ma listwiev que par un clic utilisateur ? y a pas moyen de déclencher un onItemClick avec le code ? si oui quels paramètres lui passer ? suis désolé mais comme je l'ai dit plus haut je débute en Java mais par contre je connais parfaitement html js et php.
merci de m'aider.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
6 mars 2020 à 09:22
donc je ne peux changer la couleur de fond de l'item de ma listwiev que par un clic utilisateur ?
Je n'ai pas dit ça ;)
Voici un tuto pour mieux comprendre les Adapter : https://medium.com/mindorks/custom-array-adapters-made-easy-b6c4930560dd

Tu dois customiser tes vues dans la méthode
getView()
en te basant sur le paramètre
position
.
0

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

Posez votre question
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020
6 mars 2020 à 09:45
Merci encore de ton aide mais en temps que débutant, ce que je lis dans le site que tu m'as donné c'est pour moi totalement incompréhensible.

Je vais donc trouver un autre moyen simple d'afficher ma liste de noms à l'écran avec une flottée d'EdiTtext par exemple par très beau mais pour moi plus simple.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
Modifié le 6 mars 2020 à 09:53
Je ne comprends pas ton blocage, désolé. Tu as toutes les billes pour le faire proprement.
Voici ce que je te propose

MyAdapter. java
class MyAdapter extends ArrayAdapter<String> {
    @Override
     View getView(int position, View convertView, ViewGroup parent) {
          View v = super.getView(position, convertView, parent);
          if (position == 0) {
              v.setBackgroundColor(Color.CYAN);
          } else {
             v.setBackgroundColor(Color.WHITE);
          }
          return v;
     }
} 


TonActivity.java
mListView = (ListView) findViewById(R.id.listView);
ArrayAdapter<String> adapter = new MyAdapter<String>(TirageAuSortActivity.this,
android.R.layout.simple_list_item_1, liste_joueursafficheecol1);
mListView.setAdapter(adapter); 



Et c'est tout...aux erreurs de build près car je n'ai pas testé ce que j'ai écrit ;) Mais je ne suis pas très loin.

0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020
6 mars 2020 à 16:42
Merci encore de ton aide mais mon début dans Java ne me permet pas de comprendre ce que tu me proposes aussi facilement qu'un initié. Voici mon code dans ma classe "TirageAuSortActivity":

mListView = (ListView) findViewById(R.id.listView);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(TirageAuSortActivity.this,
android.R.layout.simple_list_item_1, liste_joueursafficheecol1);
mListView.setAdapter(adapter);

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{view.setBackgroundColor(Color.CYAN)}

Quand l'utilisateur clique sur un item de la listwiew, c'est donc avec cette dernière méthode que son fond va passer en CYAN (là ça fonctionne). Mais moi, ce que je souhaite c'est faire pareil (passer un item en CYAN) mais avec du code (et non par un clic sur l'item). Tu me dis qu'il faut faire ça dans MyAdapter.java, je dois créer une classe qui va s'appeler MyAdapter.java ? quand je fais ça, j'ai des tas d'erreurs en rouge et je m'en sors pas! suis out! je pense que comme c'est vrai que tu t'intéresses à mon problème, il faut que tu me guides un peu comme un gamin qui ne sait pas grand chose, désolé mais j'en suis là (le code que j'ai écrit je l'ai pompé sur un site).

merci encore.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
6 mars 2020 à 16:55
As-tu copier/coller le code que je t'ai passé ? Quels sont les erreurs associés ?
0
Je crois avoir trouver le problème. Si tu veux afficher une liste de joueurs dans un ListView je te conseille ceci

1- Creer une classe java-beans Joueur. Une classe Java-beans n'est rien d'autre qu'une simple classe java avec des getter() et setter()
public class Joueur {
    String mNom;
    public Joueur(String nom) {
        mNom = nom;
    }
    public String getNom() {
        return mNom;
    }
    public void setNom(String nom) {
        mNom = nom;
    }
}


2- Creer dans la methode onCreate() des joueurs que tu augmentes dans la liste des joueurs a afficher et passer la ListView a une classe XXAdapter que tu vas creer et etendre a un ArrayAdapter<Joueur>.
Joueur mJoueur1 = new Joueur("joueur 1");
        Joueur mJoueur2 = new Joueur("joueur 2");
        Joueur mJoueur3 = new Joueur("joueur 3");
        Joueur mJoueur4 = new Joueur("joueur 4");

        List<Joueur> liste_joueursafficheecol1 = new ArrayList<>();
        liste_joueursafficheecol1.add(mJoueur1);
        liste_joueursafficheecol1.add(mJoueur2);
        liste_joueursafficheecol1.add(mJoueur3);
        liste_joueursafficheecol1.add(mJoueur4);

        mListView = findViewById(R.id.listView);
        Log.i(TAG, " listView exist");
        JoueurAdapter adapter = new JoueurAdapter(this, android.R.layout.simple_list_item_1, liste_joueursafficheecol1);
        mListView.setAdapter(adapter);


3- Implmenter la classe Joueuradapter
class JoueurAdapter extends ArrayAdapter<Joueur> {
    
    public JoueurAdapter(@NonNull Context context, int resource, @NonNull List<Joueur> objects) {
        super(context, resource, objects);
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        View v = super.getView(position, convertView, parent);
        if (position == 0) {
            v.setBackgroundColor(Color.CYAN);
        } else {
            v.setBackgroundColor(Color.WHITE);
        }
        return v;
    }
}
0
c'est super je vais essayer demain mais comment dire après ça je veux mettre en bleu le joueur2 ?
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894 > columbos
9 mars 2020 à 09:52
il te faudra faire une comparaison entre la position courante (celle en paramètre de la méthode getView()) et la position du joueur2
0
Drogbut > columbos
9 mars 2020 à 10:02
faut d'abord essayer et nous informer si ca resourd ton probleme car il existe une facon plus persistant de le faire. J'ai juste essayer de me restrindre a ta preocupation

Je veux mettre en bleu le joueur X revient a dire si position est egal a 1 alors met en bleu car dans une liste on compte de zero a un. Donc je joueur joueur numero 2 occupe la position numero une.
0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020
9 mars 2020 à 13:26
Salut,

Je pense que temps que je n'aurais pas pigé le principe, je vais nager, avant de vous solliciter, je cherche beaucoup mais même après avoir mis en place le code proposé par Drogbut:

1) Les 4 noms affichés devaient être Joueur1, Joueur2 etc.. moi a la place de Joueur1, il m'affiche
com.example.Tirage_au_sort.Joueur@4714e5, comprend pas grand chose !!

2) Par ailleurs, je ne pige pas du tout comment cette méthode est appelée (dans Joueuradapter.java) public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) , celle qui devrait colorier un joueur que j'aurais choisi !

3) La classe Joueuradapter.java renvoie super(context, resource, objects), comprend rien de ce que ça veut dire !

merci de votre aide encore et toujours, j'ai fait beaucoup de Visual Basic 6 avec des classes, mais je n'ai pas encore pigé le truc, ça va venir je pense parce sinon par moment je craque.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
9 mars 2020 à 13:50
1) c'est normal. Il faut rajouter surcharger la méthode
toString() 
dans l'objet Joueur proposé par Drogbut.
2) Ce n'est pas toi qui appelle la méthode getView(), c'est le système : à chaque fois que le système veut afficher une cellule de ta liste, il fait appel à cette méthode pour récupérer la vue à afficher. C'est donc tout logiquement dans cette méthode que tu "paramètres" la vue avant de l'afficher
3) C'est un constructeur qui appelle le constructeur de la classe mère. C'est de l'héritage, rien de plus

Plus d'explications sur le principe des adateurs : https://code.tutsplus.com/fr/tutorials/android-from-scratch-understanding-adapters-and-adapter-views--cms-26646
0
Drogbut > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
9 mars 2020 à 16:29
BrunoCS merci pour le rappel de methode toString(). Peux-tu mieux m'expliquer a ce sujet? pourquoi il faut forcement implementer la toString() dans ce cas ?
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894 > Drogbut
Modifié le 9 mars 2020 à 17:16
Yep. En fait, il utilise un
ArrayAdapter
(et non un BaseAdapter) et le layout "prédéfini" android.R.layout.simple_list_item_1. Ce layout est assez simple puisqu'il contient juste une TextView, visible ici. Il est donc principalement utilisé pour les liste de chaines de caractères. Or, ici, tu propose à columbos d'utiliser des objets "Joueur". Donc le système doit trouver un moyen de "faire rentrer un objet dans un champ de type String". Pour cela, il utilise la méthode
toString()
, définie de base dans la classe Objet. Et l'implémentation par défaut de Object.toString() est le comportement décrit par notre ami.
0
Columbus je crois que t'y prend tres mal en faisant le copier colee de mon code. Je vais essayer de t'aider a mieux comprendre en t'expliquant du mieux que je peux. Je vais contruire un exercice en me basant sur le tiens.

Exercice: Afficher la liste des joueurs d'une equipe de football
1- desiner une ecran qui afficher la listes des joueur. L'ecran doit etre concu de telle sorte que l'ajout ou la supression d'un joueur n'oblige pas a redesinner l'ecran. Vous pouvez utuliser une ListView dans un LinearLayout.

Bien devoir desiner poster ton code XML quand tu auras termine . . . apres verifcation on passe a la prochaine etape
0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020
9 mars 2020 à 16:59
Drogbut ton aide part d'un bonne idée mais il faut savoir que mon programme ça fait 1 mois que je suis dessus, il tourne plutôt bien(certainement pas comme un pro) mais il me reste quelques petits détails comme colorer par code un item de la listview.

Alors voilà le principe:

1) J'affiche un 1er écran qui propose 2 choix (radio boutons) (classe1):
a) Mise à jour liste des joueurs (classe2)
b) Tirage au sort des joueurs (classe3)

2) S'il lance MAJ liste (classe 2), je lis un fichier .txt (fichier des joueurs) et j'affiche tous les joueurs sur 3 colonnes (3 listview) et en bas de l'écran, j'affiche une zone (edittext) dans laquelle on peut saisir un nouveau joueur et en cliquant sur un bouton (MAJ), je le rajoute dans la liste du haut. Là, je pense qu'on peut surement faire mieux niveau code et pour revenir à la classe1, il clique sur un bouton.

3) Sur l'écran tirage (classe3), on clique sur les joueurs qui vont joueur et je les passe en CYAN (facile avec le setOnItemClickListener), une fois que j'ai assez de joueurs, je propose (via un bouton) de lancer le tirage.

4) Là, j'arrive sur un dernier écran qui va afficher les jousurs tirés au sort (classe4).

5) Le problème que j'avais était ici car s'il revenait sur l'écran précédent (classe3), je devais réafficher la liste des joueurs (là c'était facile) mais aussi colorer les joueurs qu'il avait sélectionnés juste avant et c'est ça que je n'arrivais pas à faire !

A mon avis, j'avoue que je n'ai pas trop envie de tout refaire, peut-être qu'il suffirait juste de mieux coder l'existant ?

Qu'en pense-vous ?
merci à vous deux.
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894
Modifié le 9 mars 2020 à 17:23
je devais réafficher la liste des joueurs (là c'était facile) mais aussi colorer les joueurs qu'il avait sélectionnés juste avant et c'est ça que je n'arrivais pas à faire !
ça, tu ne nous l'avais pas dit ! Du coup, il est normal que cela ne fonctionne pas ! ;) Il te faut "persister" les états des éléments pour passer d'un écran à un autre :
- soit dans la classe "Joueur", tu ajoutes un booléen "selected" (par exemple) qui est faux par défaut et vrai si le joueur a été sélectionné (dans l'écran 3 si j'ai bien compris). Pour le coup, dans l'écran 2, au niveau du getView() de l'Adapter, plus besoin de se baser sur la position mais plutôt sur cette valeur booléenne.
- soit avoir un objet (singleton, manager, comme tu veux) qui te permettra de stocker les joueurs sélectionnés sur l'écran 3. Ensuite, sur l'écran 2, au niveau du getView() de l'Adapter, tu colores en cyan les joueurs que tu retrouves dans ce singleton.

Note : pour le point 3, ce n'est pas une très bonne idée le coup des 3 ListViews...tu aurais pu utiliser un GridLayout...
0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020 > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
9 mars 2020 à 17:37
Désolé je n'avais parlé que du problème de coloriage que j'ai toujours. Alors comment dire, je ne vois toujours pas comment colorier un joueur à l'écran par du code ! avec le setOnItemClickListener c'est simple de le faire (là ça fonctionne bien), dés qu'il clique sur le joueur1, la méthode précédente se déclenche et le code view.setBackgroundColor(Color.CYAN) passe le fond du joueur1 en CYAN. Pour le boolean, j'ai utilisé une autre méthode (j'étais informaticien) qui revient au même.

Exemple, je veux passer en CYAN le joueur1, quel code je tape ? j'ai l'impression de ne pas me faire comprendre c'est peut-être que je ne pose pas bien la question ! je ne sais pas trop.
0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020 > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
10 mars 2020 à 09:17
Je te site:
Ensuite, sur l'écran 2, au niveau du getView() de l'Adapter, tu colores en cyan les joueurs que tu retrouves dans ce singleton.

Question (mon problème depuis le départ)
Comment je fais pour colorer le joueur 3 par exemple? quel code taper pour appeler la méthode getWiev de l'adapter?

merci
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 894 > columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020
Modifié le 10 mars 2020 à 10:50
Je me cite (cf. commentaire N°16): "Ce n'est pas toi qui appelle la méthode getView(), c'est le système : à chaque fois que le système veut afficher une cellule de ta liste, il fait appel à cette méthode pour récupérer la vue à afficher. C'est donc tout logiquement dans cette méthode que tu "paramètres" la vue avant de l'afficher"
Autrement dit, c'est "magique" : il suffit de passer l'Adapter à la ListView pour cela soit appeler quand il le faut.

Par analogie, c'est comme si tu allais dans un stand de gaufre et que tu demandais une gaufre au chocolat :
1. le serveur (ici l'
Adapter
) va prendre une gaufre nature (ici,
super.getView()
),
2. il va mettre du chocolat dessus (ici, le corps de ta méthode
getView()
)
3. il te la donne (le
return 
de ton
getView()
)

Tu comprends bien que si tu avais demandé une gaufre au caramel, ce sont les même étapes, sauf la 2e qui change en fonction de ce que tu veux.

Maintenant, il va vraiment falloir mettre les mains dedans, avancer et nous montrer ton code...Sinon, on va rester dans le théorique et tu n'as pas l'air d'accrocher (sans être méchant, hein!)
0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020 > BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024
Modifié le 11 mars 2020 à 08:56
Merci pour ton aide, j'ai mieux compris le mécanisme et j'ai donc pu avancer un peu (Quand tu dis tu n'as pas l'air d'accrocher, faut savoir que ça fait un mois que je galère tout seul 4 heures par jour à chercher de partout les tutos pour y arriver, je pense que je suis plutôt un accrocheur (sans être désagréable bien sur et j'apprécie vraiment l'aide de vous 2). voici une partie de mon code:

1) Joueurs.java (où j'ai trouvé comment gérer les boolean)
public class Joueurs
{
    String mNom;
    boolean zboulean;

    public Joueurs(String nom)
        {mNom = nom;
        zboulean = false;}

    public Joueurs (Boolean zbool)
        {zboulean = zbool;}

    public Boolean selected ()
        {return zboulean;}

    public String getNom()
        {return mNom;}

    public void setNom(String nom)
        {mNom = nom;}
}


2) Classe 2
Ici, je vais mettre à jour le boolean (flase à l'init et true ensuite si sélectionné) ou récupérer sa valeur (ça fonctionne bien)
Boolean zbool;
Joueurs mJoueur2.zboulean = true;
zbool =  mJoueur2.zboulean;           ==> ça me retourne True c'est bon


3) Classe 3
Alors maintenant le vif du sujet le getView, voici mon code
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

        View v = super.getView(position, convertView, parent);
        if (OK)
            {v.setBackgroundColor(Color.CYAN);}
        else
            {v.setBackgroundColor(Color.WHITE);}
        return v;
    }

Comment connaître la valeur du boolean du 1er position 0 (remplacer le OK par le boolean), quel code écrire pour connaître la valeur du boolean du joueur position 0?

3) Je me suis lancé sur une autre de tes idées le GridLayout, j'ai crée un Layout.xml pour essayer et j'y ai mis une GridLayout, j'ai mis des EdiTText à l'intérieur pour afficher les noms de mes joueurs c'est bien ? sachant que je ne sais pas combien j'ai de joueurs au départ (je vais lire le ficher .txt des joueurs), ça veut dire qu'il va me falloir créer des ediTText en dynamic ?

merci encore et toujours à vous 2.
0
Sans code source il mais vraiment impossible de t'aider. deja je ne comprend pas tjr ta preoccupation. Si tu peux poster ton code source, on poura mieux t#aider mais sans code source, j'arrive pas a te scener.
0
columbos Messages postés 18 Date d'inscription jeudi 5 mars 2020 Statut Membre Dernière intervention 16 mars 2020
9 mars 2020 à 17:38
Lire ma réponse à BunoCS et peut-être que tu comprendras mieux mon seul problème pour l'instant. J'ai l'impression que j'en aurais d'autres après!!
0