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

Android Discussion :

Personnalisation objet (SQLite)


Sujet :

Android

  1. #1
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut Personnalisation objet (SQLite)
    Mon problème est assez difficile a expliquer :

    J'ai des données dans une base SQLite.
    Je récupère les élément d'une table et j'affiche ces données dans une listview à l'aide d'un fichier XML personnalisé pour mettre en forme ces objets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void DataBind(){
        	Cursor c = db.recupererInfo();
        	startManagingCursor(c);
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.recup_listinfo, c,
        	new String[]{"numero", "heure_depart", "ville_depart", "heure_arrivee", "ville_arrivee", "destination", "nb_pers"}, 
        	new int[]{R.id.textNumero, R.id.textHeureDepart, R.id.textVilleDepart, R.id.textHeureRetour, R.id.textVilleRetour, R.id.textDestination, R.id.textNbPers} );
        	listview.setAdapter(adapter);
        	listview.setOnItemClickListener(this);
    }
    J'aimerais agir sur chaque objet qui va se créer pour pouvoir personnaliser le background de chaque objet en fonction d'une donnée dans la base.

    J'illustre mon problème par un morceau de code que j'avais imaginé :

    Pour chaque élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        	RelativeLayout cadreCouleur;
        	cadreCouleur = ((RelativeLayout)this.findViewById(R.id.cadreCouleur));
        	while(i < tailleCursor)
        	{
        		c.moveToPosition(i);
        		if(c.getString(9) != "")
            	{
            		cadreCouleur.setBackgroundColor(R.color.red);
            	}
        		i++;
        	}
    La méthode "startManagingCursor(c)" semble s’exécuter en une seule fois, non pas ligne par ligne, comment personnaliser chaque objet si tout se fait en une fois ?

  2. #2
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 592
    Points : 18 498
    Points
    18 498
    Par défaut
    Là tu utilises un SimpleCursorAdapter, pour personnaliser des views il faut faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ((SimpleCursorAdapter) adapter).setViewBinder(
         new SimpleCursorAdapter.ViewBinder(){
     
              public boolean setViewValue(View view, Cursor cursor, int columnIndex){
                   if(columnIndex == 9){
                        RelativeLayout cadreCouleur = ((RelativeLayout)view.findViewById(R.id.cadreCouleur));
                        // Là tu modifies
                        return true;
                   }
                   return false;
              }
         }
    );
    Keith Flint 1969 - 2019

  3. #3
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Bonjour, merci de votre réponse.

    J'ai intégré votre code dans ma fonction comme ceci :

    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
        public void DataBind(){
        	Cursor c = db.recupererInfo();
        	startManagingCursor(c);
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.recup_listinfo, c,
        	new String[]{"numero", "heure_depart", "ville_depart", "heure_arrivee", "ville_arrivee", "destination", "nb_pers"}, 
        	new int[]{R.id.textNumero, R.id.textHeureDepart, R.id.textVilleDepart, R.id.textHeureRetour, R.id.textVilleRetour, R.id.textDestination, R.id.textNbPers} );
        	listview.setAdapter(adapter);
        	listview.setOnItemClickListener(this);
     
        	((SimpleCursorAdapter) adapter).setViewBinder(
    		     new SimpleCursorAdapter.ViewBinder(){
     
    		          public boolean setViewValue(View view, Cursor cursor, int columnIndex){
    		               if((cursor.getString(9)).equals("")){
    		                    RelativeLayout cadreCouleur = ((RelativeLayout)view.findViewById(R.id.cadreCouleur));
    		                    cadreCouleur.setBackgroundColor(R.color.red);
    				            Log.d("is_read", cursor.getString(9).toString());
    		                    return true;
    		               }
    		               return false;
    		          }
    		     }
        	);
        }
    Comme ça ne marchait pas et que je n'avais pas d'erreur j'ai mis un petit log.d pour voir la fameuse valeur de la colonne is_read de ma table (9ème colonne), sa me la renvois 21 fois par ligne.
    Je ne comprend pas pourquoi... il n'y a qu'une seule valeur a la 9ème colonne du cursor et je n'ai qu'une ligne dans ma table pourquoi 21 fois...

    Je suis un peu perdu...

  4. #4
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 592
    Points : 18 498
    Points
    18 498
    Par défaut
    Ton if ne veut rien dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((cursor.getString(9)).equals(""))
    En fait (en gros) setViewValue() est appelé pour chaque éléments de int to[] et pour chaque élément du cursor.
    Si ça se trouve t'as 7 trucs à dessiner, et 3 entrées du coup ça fait 21.
    Enfin je dis peut être que des conneries en gros.

    Mais ton if est faux c'est sûre.
    Keith Flint 1969 - 2019

  5. #5
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Ah oui d'accord, en effet c'est faux... mais c'est bizarre je vais chercher la valeur de is_read dans ma table ou il n'y a qu'une seule entrée... et en tout il y a 11 données par entrée, aucune chance que sa me retourne 21 fois la même valeur...

    J'arrive bien a changer la couleur de font du layout associé a la classe, par contre je ne peux pas modifier le layout dont je me sert pour personnaliser les objets de ma listview.

    Parce que c'est ça que je voudrais faire, pour une données précise de ma table suivant sa valeur personnaliser le background de chaque objet.

  6. #6
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 592
    Points : 18 498
    Points
    18 498
    Par défaut
    Est-ce que la valeurs qui t’intéresse fait partie de cette liste :
    "numero"
    "heure_depart"
    "ville_depart"
    "heure_arrivee"
    "ville_arrivee"
    "destination"
    "nb_pers"

    Si oui, tu peux faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(columnIndex == cursor.getColumnIndex("nb_pers")){
         // et là selon la valeur tu peux faire ton traitement
    }
    Enfin déjà si tu fais un if de ce genre, ça devrait faire ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Log.d("is_read", cursor.getString(9).toString())
    ; beaucoup moins souvent.
    Keith Flint 1969 - 2019

  7. #7
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    J'ai réussis à avancer dans mon problème :

    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
    public void DataBind(){
        	Cursor c = db.recupererInfo();
        	startManagingCursor(c);
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(this.getBaseContext(), R.layout.recup_listinfo, c,
        	new String[]{"numero", "heure_depart", "ville_depart", "heure_arrivee", "ville_arrivee", "destination", "nb_pers"}, 
        	new int[]{R.id.textNumero, R.id.textHeureDepart, R.id.textVilleDepart, R.id.textHeureRetour, R.id.textVilleRetour, R.id.textDestination, R.id.textNbPers} );
     
        	adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        		public boolean setViewValue(View view, Cursor cursor, int columnIndex){
        		    if (view.getId() == R.id.textDestination) {
        		    	((TextView) view).setTextColor(android.graphics.Color.RED); 
        		        return true;
        		    }
        		    return false;
        		}
        	});
     
        	listview.setAdapter(adapter);
        	listview.setOnItemClickListener(this);
        }
    La je peux mettre en couleur le champs destination ou un autre, mais je voudrais mettre en couleur le conteneur de ces champs, le relativeLayout.
    MAIS si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (view.getId() == R.id.cadreCouleur) {
        		    	((RelativeLayout) view).setBackgroundColor(android.graphics.Color.RED);
    Sa ne marche plus...

    J'ai l'impression que je ne peux personnaliser avec cette méthode que les champs que j'ai utiliser dans l'adapter au dessus.
    Mais dans ce cas comment faire...

  8. #8
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 592
    Points : 18 498
    Points
    18 498
    Par défaut
    Peut être que tu peux faire getParent() de view jusqu'à tomber sur ton RelativeLayout.

    Ne fais pas de cast quand tu fais setBackgroundColor, c'est propre à View, donc tout ce qui hérites de cette classe le possède aussi, donc on s'en fout que ce soit un TextView ou LinearLayout ou n'importe quoi hérité de View, et si ça se trouve ça peut créer une CastException.
    Keith Flint 1969 - 2019

  9. #9
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Oh ! Merci !

    En effet en laissant le cast RelativeLayout mais en faisant un getParent() sur view ça fonctionne !!

    Merci beaucoup pour votre aide !

    PS : je n'avais pas vu le message de ne pas faire de cast mais il est obligatoire par contre, pas forcément en RelativeLayout mais il faut mettre (View) au minimum.

  10. #10
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 592
    Points : 18 498
    Points
    18 498
    Par défaut
    C'est bizarre parce que c'est View view, donc il devrait savoir que c'est une View, enfin bon...
    Parfois il y a des choses étrange...

    Je retesterais, mais dans mon code j'ai des view.findViewById() et je modifie comme je veux.
    J'essaierais de changer la couleur d'un LinearLayout pour voir.

    Edit :
    Ok j'ai compris, tu parles du cast quand tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((View)view.getParent()).setBackGroundColor(Color.MAGENTA);
    getParent() sur un View ça retourne un ViewParent et apparemment ça n'a pas setBackgroundColor.

    Et si on doit utiliser getParent() c'est peut être parce que tu créer le SimpleCursorAdapter avec cette RelativeLayout justement.
    T'avais un NullPointerException ?
    Keith Flint 1969 - 2019

  11. #11
    Membre habitué Avatar de Willy55
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 188
    Points : 131
    Points
    131
    Par défaut
    Exactement !

    Petit info supplémentaire pour ceux qui voudront faire pareil, le champ sur lequel on applique le getParent reste fixé a sa valeur d'origine dans le layout (par défaut "TextView") il perd son initialisation dans le code, j'ai donc rajouté un Textview dans mon layout, invisible et sans texte pour faire le getParent() dessus.
    J'espère que je suis clair

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

Discussions similaires

  1. [Débutant] mapper des objets sur une table de sqlite
    Par fourchette dans le forum C#
    Réponses: 16
    Dernier message: 19/04/2012, 14h45
  2. persistance d'un objet SQLite
    Par slix_alex dans le forum SQLite
    Réponses: 0
    Dernier message: 17/03/2011, 18h34
  3. [Joomla!] Personnalisation d'objet avant commande
    Par brsi0566 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 28/12/2009, 18h23
  4. Personnaliser l'objet Treeveew au niveau du Skin
    Par Delphi-ne dans le forum ASP.NET
    Réponses: 5
    Dernier message: 02/04/2009, 17h43
  5. Personnalisation d'une propriété d'un objet
    Par Domi2 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/08/2007, 09h42

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