IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

Modifier le style d'un Textview avec HashMap


Sujet :

Composants graphiques Android

  1. #1
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut Modifier le style d'un Textview avec HashMap
    Bonjour,

    J'utilise un HashMap pour créer une ListView.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while (...) 
    {
       map = new HashMap<String, String>();
       map.put("id_textview", "mon label");
       listItem.add(map);
    }
     
    mSchedule = new SimpleAdapter (getBaseContext(), listItem, R.layout.item,
                new String[] {"id_textview"}, 
                new int[] {R.id.id_textview});
    listView.setAdapter(mSchedule);
    Mais je ne vois pas du tout comment m'y prendre pour par exemple rendre ce texte rouge. Comment faire?

    Merci

  2. #2
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Ajoutes la propriété android:textColor au TextView de ton R.layout.item
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  3. #3
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Oui mais je voudrais changer cette couleur dynamiquement pour chaque item ajouté. Et je ne vois pas comment attribuer une valeur à textColor par le HashMap

  4. #4
    Membre Expert
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Par défaut
    Comme son nom l'indique, SimpleAdapter sert à faire des choses basiques. Dans ton cas, il est nécessaire de créer ton propre adaptateur (par extension d'un adaptateur existant) pour pouvoir redéfinir la méthode getView. Ainsi, tu décrira précisément l'apparence de chaque item à construire.
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS

    Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android

  5. #5
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 279
    Par défaut
    Je pense qu'un truc comme ça pourrait le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class MonAdapter extends BaseAdapter {
    	private HashMap <String, String> mListe;
    	private LayoutInflater mInflater;
    	private ArrayList <String> mListeCle;
     
    	public MonAdapter(Context mContext, HashMap<String, String> mListe, ArrayList <String> mListeCle){
    		mInflater = LayoutInflater.from(mContext); 
    		this.mListe = mListe;
    		this.mListeCle = mListeCle;
    	}
    	public int getCount() {
    		return mListe.size();
    	}
     
    	public Object getItem(int position) {
    		return mListe.get(mListeCle.get(position));
    	}
     
    	public long getItemId(int position) {
    		return 0;
    	}
     
    	public View  getView(int position, View convertView, ViewGroup parent){
    		LinearLayout layoutItem;
     
    		if (convertView == null) {
    			layoutItem = (LinearLayout) mInflater.inflate(R.layout.mon_layout, parent, false);
    		} else {
    			layoutItem = (LinearLayout) convertView;
    		}
     
    		// Clé : mListeCle.get(position)
    		// Valeure : mListe.get(cle)
     
    		return layoutItem;
    	}
     
    }
    Mais j'aime pas trop les HashMap...

  6. #6
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Merci pour la réponse. En fait je suis déjà tombé sur quelque chose comme ça ailleurs, mais je ne comprends pas son utilisation.

    Moi je renseigne simplement le Hashmap, la liste des clés, mais où mettre indiquer la couleur du textView présent dans mon_layout?

    Petite parenthèse: qu'utiliserais-tu sans Hashmap?

  7. #7
    Membre prolifique
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    10 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 10 279
    Par défaut
    Tu créer un fichier de layout.
    Même si c'est c'est qu'un TextView dans un LinearLayout.

    Tu le mets là dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layoutItem = (LinearLayout) mInflater.inflate(R.layout.mon_layout, parent, false);
    Imagine que ton layout s'appelle mon_layout.
    Et qu'à l'intérieur t'as un TextView monTextView.

    Et ben dans getView tu feras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    layoutItem.findViewById(R.id.monTextView);
    Et voilà tu feras les opérations que tu veux sur ton TextView ou n'importe quel éléments de ton layout.

    Moi j'aurais créé une classe, et créé une ArrayList d'instance de cette classe, par exemple.

    Après ça dépend de quelle données tu pars.

  8. #8
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Aie aie aie je me prends la tête à tenter de mettre ne place cet Adapter!

    Dans le constructeur, tu mets un Hashmap<String, String> mListe, mais moi, quand l'instancie, j'utilise un ArrayList<HashMap<String, String>>...
    J'ai tenté de modifier les types de variable dans tous les sens, mais sans succès, j'ai des problèmes de méthodes indéfinies qui apparaissent (get)...

    En clair voila le problème:
    - J'ai un layout ITEM correspondant à une ligne.
    - Dans ce layout, j'ai 3 TextView.
    - Je dois modifier leur texte (d'où l'association paire-valeur du HashMap)
    - et leur couleur.

    Je me mélange entre tous les objets, si quelqu'un pouvait m'aider dans ma quête...

    Merci

  9. #9
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Je suis tombé sur ce tuto, j’espère qu'il va m'aider mais si vous avez des idées... !

    Youhouu tuto extraordinaire ça fonctionne! et je suis bien passé par le ListArray

  10. #10
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Il me reste un problème... je n'arrive pas à supprimer tous les élements.
    Mon but c'est de supprimer toutes les lignes à chaque fois que je sélectionne un nouvel élément dans un spinner (liste déroulante), puis rajouter une nouvelle liste.

    Voila ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private ArrayList listItems = new ArrayList();
     
    OnCreate() {
       listView = (ListView) findViewById(R.id.listView);
       listAdapter = new AdapterP(getBaseContext(), listItems);
       listView.setAdapter(listAdapter);
     
       // Ici j'initialise le spinner
    }
     
    onItemSelected() {
       listItem.clear();
       listAdapter = new AdapterP(this, listItems);
       listAdapter.notifyDataSetChanged();
     
       Thread_de_recuperation_de_donnees();
     
    }
     
    Handler_du_Thread() {
       listAdapter = new AdapterP(getBaseContext(), listItems);	
       listAdapter.notifyDataSetChanged();	
    }
    Mais le soucis, c'est qu'au premier lancement rien ne s'affiche.
    A la sélection d'un autre element du spinner, ça s'affiche du coup en double.
    A la sélection d'un 3e, ça cumule encore... rien n'est donc supprimé, ET j'ai un problème d'affichage lors de l'initialisation.

    D'où vient le problème?
    Merci

  11. #11
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Pourquoi est ce que tu recrées ton adapter a chaque coup ?

    De plus juste pour savoir est ce que tu mets bien à jour cette varaible listItems.

    Car tu recrées ton adapter mais on voit nulle part le fait que tu nettoies cette liste avant.

    Si tu veux supprimer ajouter un élément dans ta liste, alors il te suffit juste depuis ton Adapter à mettre la liste des éléments à jour et d'appeller comme tu le fais le notifyDataSetChanged().
    Tu n'as pas besoin de créer un nouvel adapter :s.

  12. #12
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Merci pour la réponse. Entre temps je m'en suis sorti en faisant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    OnCreate() {
       listViewM = (ListView) findViewById(R.id.listViewTransactions);
       listAdapter = new AdapterP(this, listItems);
       listViewM .setOnItemClickListener(new OnItemClickListener() {  
             // Listener
          }
       });  
       listViewM .setAdapter(listAdapter);
    }
     
    Handler() {
     
       // int what = 1 (en cours):
       Bundle donnees = msg.getData();
       listItems.add(new styleListView(donnees.getInt("donnees"),
     
       // int what = 2 (end) :
       istAdapter = new AdapterP(Class.this, listItems);	
       listAdapter.notifyDataSetChanged();
       listViewM .setAdapter(listAdapter);
     
    }
    Le .clear() je le fais dans le Thread de traitement au début.
    Mais en testant, j'ai été obliger d'en créer un nouveau à chaque end, sinon le changement n'est pas pris en compte avec seulement un notifyDataSetChanged().

  13. #13
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Mais en testant, j'ai été obliger d'en créer un nouveau à chaque end, sinon le changement n'est pas pris en compte avec seulement un notifyDataSetChanged().
    Si tel est le cas alors tu as un souci sur la gestion de tes données dans ton Adapter.

    Normalement un notifyDataSetChanged suffit à notifier à la liste à se mettre à jour.

    Car là niveau performance c'est vraiment pas terrible :/

  14. #14
    Membre éprouvé
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Par défaut
    Voila l'adaptateur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    public class AdapterP extends BaseAdapter {
     
    	private List<styleListView> mListP;
    	private Context mContext;
    	private LayoutInflater mInflater;
    	private ArrayList<AdapterPListener> mListListener = new ArrayList<AdapterPListener>();
     
    	public interface AdapterPListener {
    	    public void onClickTransaction(styleListView item, int position);
    	}
     
    	public void addListener(AdapterPListener aListener) {
    	    mListListener.add(aListener);
    	}
     
    	public AdapterP(Context context, List<styleListView> aListP) {
    		mContext = context;
    		mListP = aListP;
    		mInflater = LayoutInflater.from(mContext);
    	}
     
    	public int getCount() {
    		return mListP.size();
    	}
     
    	public Object getItem(int position) {
    		return mListP.get(position);
    	}
     
    	public long getItemId(int position) {
    		return position;
    	}
     
    	public View getView(int position, View convertView, ViewGroup parent) {
     
    		LinearLayout layoutItem;
    		TextView t;
    		ImageView i;
     
    		if (convertView == null) {
    			layoutItem = (LinearLayout) mInflater.inflate(R.layout.item_transactions, parent, false);
    		} else {
    			layoutItem = (LinearLayout) convertView;
    		}
     
    		// Traitements
     
    		return layoutItem;
    	}
     
    }
    J'ai suivi le tuto à lettre pourtant.
    Normalement, d'après toi, je devrais faire seulement un new Adapter et setAdapter dans le OnCreate() c'est ça? (et faire un setNotification à chaque fois que je renouvelle?). Je vais retester mais ça ne fonctionnait pas...

  15. #15
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Normalement, d'après toi, je devrais faire seulement un new Adapter et setAdapter dans le OnCreate() c'est ça? (et faire un setNotification à chaque fois que je renouvelle?). Je vais retester mais ça ne fonctionnait pas..
    Oui .

    Après attention la liste que tu dois tenir à jour avant d'effectuer le notifyDataSetChanged est la liste mListP qui se trouve dans l'adapter. C'est cette liste qui doit être à jour.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/07/2011, 10h05
  2. une fonction modifiant le style avec z-index
    Par Stuff dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 14/10/2008, 09h48
  3. [TRichEdit] Comment modifier le style d'une sélection ?
    Par PpPool dans le forum Composants VCL
    Réponses: 2
    Dernier message: 15/11/2005, 10h16
  4. modifier le contenu d'une table avec innerHTML
    Par francon81 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/05/2005, 09h02
  5. [VB.NET] Comment envoyer un texte modifié(couleurs,style...)
    Par fdiedler dans le forum Windows Forms
    Réponses: 8
    Dernier message: 14/03/2005, 18h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo