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 :

SimpleCursorAdapter à SimpleAdapter


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 SimpleCursorAdapter à SimpleAdapter
    Bonjour,

    Lorsque j'utilisais un SimpleCursorAdapter j'utilisais la fonction

    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
        	adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        		public boolean setViewValue(View view, Cursor cursor, int columnIndex){
        		    if (view.getId() == R.id.OptionColor) {
     
        		        final String colorIR = cursor.getString(cursor.getColumnIndex("is_read"));
        		        final String colorIO = cursor.getString(cursor.getColumnIndex("is_ok"));
     
        		        if(colorIR.equals("null") && colorIO.equals("null"))
        		        {
        		        	((View) view.getParent()).setBackgroundColor(android.graphics.Color.WHITE);
        		        }
        		        else if(!(colorIR.equals("null")) && colorIO.equals("null"))
        		        {
        		        	((View) view.getParent()).setBackgroundColor(android.graphics.Color.parseColor("#F99DA6"));
        		        }
        		        else if(!(colorIR.equals("null")) && !(colorIO.equals("null")))
        		        {
        		        	((View) view.getParent()).setBackgroundColor(android.graphics.Color.parseColor("#A4F7A4"));
        		        }
        		       	return true;
        		    }
        		    return false;
        		}
        	});
    Qui me permettait de personnaliser chaque fond de mes objets dans la listview en fonction d'un paramètre de la table.

    Pour des besoins de personnalisation je suis repasser a un simpleAdapter, y a t-il une méthode équivalente ?

  2. #2
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Personnellement avec les SimpleCursorAdapter je n'utilise ni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bindView(View view, Context context, Cursor cursor)
    ni :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    newView(Context context, Cursor cursor, ViewGroup parent)
    Je passe par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public View getView(int position, View convertView, ViewGroup parent)
    Comme avec un BaseAdapter.

    Et dedans je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Cursor cursor = getCursor();
    cursor.moveToPosition(position);
     
    LinearLayout layoutItem;
     
    if (convertView == null) {
         layoutItem = (LinearLayout) mInflater.inflate(R.layout.layout, parent, false);
    } else {
         layoutItem = (LinearLayout) convertView;
    }
    Et là t'as toutes les infos et les layout où les mettre.
    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
    Oui mais maintenant j'utilise un SimpleAdapter et plus un SimpleCursorAdapter

    Comment personnaliser le fond de chaque objet de ma ListView avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ArrayList<Integer> returnedValueNumero = new ArrayList<Integer>();
    	ArrayList<String> returnedValueHD = new ArrayList<String>();
    	ArrayList<String> returnedValueVD = new ArrayList<String>();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ListSeparer adapter;
    Map<String,String> bc;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public Map<String,?> createBC(int numero, String heure_depart, String ville_depart) {  
    		bc = new HashMap<String,String>();
    		bc.put("numero", String.valueOf(numero));
    		bc.put("heure_depart", heure_depart);  
    		bc.put("ville_depart", ville_depart);
    		return bc;  
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Integer[] valueNumero = returnedValueNumero.toArray(new Integer[returnedValueNumero.size()]);    	
            String[] valueHD = returnedValueHD.toArray(new String[returnedValueHD.size()]);
            String[] valueVD = returnedValueVD.toArray(new String[returnedValueVD.size()]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    adapter = new ListSeparer(this);
        	List<Map<String,?>> today = new LinkedList<Map<String,?>>();
     
        	i=0;
            while(i < valueNumero.length)
            {
            	if(valueDateDep[i].equals("2012-05-07"))
            	{
            		today.add(createBC(valueNumero[i], valueHD[i], valueVD[i])); 
            	}
            	i++;
            }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    adapter.addSection("Aujourd'hui", new SimpleAdapter(this, today, R.layout.recup_listinfo, 
            new String[]{"numero_bc", "heure_depart", "ville_depart"}, 
            new int[]{R.id.textNumeroBC, R.id.textHeureDepart, R.id.textVilleDepart}));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    listview.setAdapter(adapter);
        	listview.setOnItemClickListener(this);
    Comme ça j'ai une listview avec des catégories, grace a la classe ListAdapter, mais je voudrais personnaliser le fond de chaque élément de ma listeView.

    Avec le SimpleCursorAdapter j'utilisais 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
        	adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
        		public boolean setViewValue(View view, Cursor cursor, int columnIndex){
        		    if (view.getId() == R.id.OptionColor) {
     
        		        final String colorIR = cursor.getString(cursor.getColumnIndex("is_read"));
        		        final String colorIO = cursor.getString(cursor.getColumnIndex("is_ok"));
     
        		        if(colorIR.equals("null") && colorIO.equals("null"))
        		        {
        		        	((View) view.getParent()).setBackgroundColor(android.graphics.Color.WHITE);
        		        }
        		        else if(!(colorIR.equals("null")) && colorIO.equals("null"))
        		        {
        		        	((View) view.getParent()).setBackgroundColor(android.graphics.Color.parseColor("#F99DA6"));
        		        }
        		        else if(!(colorIR.equals("null")) && !(colorIO.equals("null")))
        		        {
        		        	((View) view.getParent()).setBackgroundColor(android.graphics.Color.parseColor("#A4F7A4"));
        		        }
        		       	return true;
        		    }
        		    return false;
        		}
        	});
    Et pour chaque élément je pouvais personnaliser le fond mais apparemment on ne peut pas l'utiliser avec SimpleAdapter.

    Sachant que mon fichier recup_listinfo.xml est un relative layout contenant les champs numero, heure_depart, ville_depart, le fond est d'une couleur différente suivant la valeur d'un autre champs dans une autre arraylist.

  4. #4
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Oui je me suis trompé je voulais dire CursorAdapter et pas SimpleCursorAdapter.

    Créer ta classe qu'extends CursorAdapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MonAdapter extends CursorAdapter{
     
         private LayoutInflater mInflater;
     
         public MonAdapter(Context context, Cursor cursor) {
              super(context, cursor);
              mInflater = LayoutInflater.from(context); 
         }
     
         public View getView(int position, View convertView, ViewGroup parent){
              // Là j'ai déjà éxpliqué
         }
    }
    Mais bon normalement tu devrais utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public bindView(View view, Context context, Cursor cursor)
    public newView(Context context, Cursor cursor, ViewGroup parent)
    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
    J'ai deja une classe qui extends de BaseAdapter :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    package navibc.listseparer;
     
    import java.util.LinkedHashMap;
    import java.util.Map;
     
    import navibc.tablette.R;
    import android.content.Context;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Adapter;
    import android.widget.ArrayAdapter;
    import android.widget.BaseAdapter;
     
    public class ListSeparer extends BaseAdapter {
     
     
    	public final Map<String,Adapter> sections = new LinkedHashMap<String,Adapter>();  
        public final ArrayAdapter<String> headers;  
        public final static int TYPE_SECTION_HEADER = 0;  
     
    	public ListSeparer(Context context) {
                   //pour les entetes j'utilise le fichier list_header.xml
    		headers = new ArrayAdapter<String>(context, R.layout.list_header); 
    	}
     
    	//méthode pour ajouter dans le header le nom de ma catégorie et dans sections le nom et un objet adapter
    	 public void addSection(String section, Adapter adapter) {  
    		 this.headers.add(section);  
    		 this.sections.put(section, adapter);  
          }  
    	 //Renvoi la position d'un clique
    	  public Object getItem(int position) {  
    		        for(Object section : this.sections.keySet()) {  
    		            Adapter adapter = sections.get(section);  
    		           int size = adapter.getCount() + 1;  
     
    		          // récupération de la position dans la section 
    		            if(position == 0) return section;  
    		            if(position < size) return adapter.getItem(position - 1);  
     
    		           // passe à la section suivant  
    		            position -= size;  
    	        }  
    		         return null;  
    	    }
    	  // renvoi le nombre d'item
    	   public int getCount() {  
               // 	total de l'ensemble des sections, plus une pour chaque tête de section
               int total = 0;  
               for(Adapter adapter : this.sections.values())  
                   total += adapter.getCount() + 1;  
               return total;  
           }  
     
           public int getViewTypeCount() {  
                int total = 1;  
               for(Adapter adapter : this.sections.values())  
                   total += adapter.getViewTypeCount();  
               return total;  
           }  
     
            public int getItemViewType(int position) {  
                int type = 1;  
                for(Object section : this.sections.keySet()) {  
                    Adapter adapter = sections.get(section);  
                    int size = adapter.getCount() + 1;  
     
                    // Récupération de la position dans la section
                    if(position == 0) return TYPE_SECTION_HEADER;  
                    if(position < size) return type + adapter.getItemViewType(position - 1);  
     
                    // passe a la section suivante moins un par l'entête 
                    position -= size;  
                    type += adapter.getViewTypeCount();  
                }  
                return -1;  
            }  
     
            public boolean areAllItemsSelectable() {  
                return false;  
            }  
     
            public boolean isEnabled(int position) {  
                return (getItemViewType(position) != TYPE_SECTION_HEADER);  
            } 
     
     
     
            public View getView(int position, View convertView, ViewGroup parent) {  
                int sectionnum = 0;  
                for(Object section : this.sections.keySet()) {  
                    Adapter adapter = sections.get(section);  
                    int size = adapter.getCount() + 1;  
     
                    // Récupération de la position dans la section  
                    if(position == 0) return headers.getView(sectionnum, convertView, parent);  
                    if(position < size) return adapter.getView(position - 1, convertView, parent);  
     
                    // otherwise jump into next section  
                    position -= size;  
                    sectionnum++;  
                }  
                return null;  
            }  
     
     
            public long getItemId(int position) {  
                return position;  
            }  
    }
    C'est dans la méthode getView alors, que je peux jouer sur les fonds du layout ?

  6. #6
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Ouais ben suis les tuto :
    http://mickael-lt.developpez.com/tut...iser-listview/
    http://a-renouard.developpez.com/tut...iser-listview/

    Dans le constructeur de ta classe qu'extends BaseAdapter tu reçois une ArrayList.

    Avec position dans getView tu récupères super simplement l'item que tu veux :
    Les ArrayList c'est trop bien.
    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
    La en l’occurrence dans mon cas non, le constructeur de la classe qui extends BaseAdapter ne reçois pas d'ArrayList.

  8. #8
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Il ni a pas grand chose qui change.
    En fait toi t'appelles plusieurs fois une méthode qui va remplir une ArrayList.
    Personnellement je trouve ça beaucoup plus logique de d'abord créé l'ArrayList et de créer l'Adapter après.

    Aussi bien si tu modifies l'ArrayList, la ListView va se mettre à jour.

    Change de tuto, celui là à l'air beaucoup trop compliqué, apparemment ils font des trucs étrange.

    Genre chez moi getCount c'est un truc du genre :
    Ou getItem() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return liste.get(position);
    Quoi ça pourrait être return null; vu que je me sers jamais de getItem() mais getCount() est important par contre.

    Tu peux créer une ArrayList d'objet ?
    Si c'est le cas t'as fais le plus dur.

    Il suffit de faire un constructeur dans ta classe qui va recevoir cette liste.
    Après tu te fais un layout.
    Et tu fais ce que tu veux dans getView.
    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
    Oui bien sur ma listview d'objet est faites, le layout est deja fait les objets s'affiche correctement MAIS ils sont tous pareil, je voudrais que chaque élément ai un fond différent en fonction d'une valeur.

    Je poste tout mon code parce que je n'ai pas envie de tout refaire :

    Classe ListSeparer :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    public class ListSeparer extends BaseAdapter {
     
     
    	public final Map<String,Adapter> sections = new LinkedHashMap<String,Adapter>();  
        public final ArrayAdapter<String> headers;  
        public final static int TYPE_SECTION_HEADER = 0;  
     
    	public ListSeparer(Context context) {
                   //pour les entetes j'utilise le fichier list_header.xml
    		headers = new ArrayAdapter<String>(context, R.layout.list_header); 
    	}
     
    	//méthode pour ajouter dans le header le nom de ma catégorie et dans sections le nom et un objet adapter
    	 public void addSection(String section, Adapter adapter) {  
    		 this.headers.add(section);  
    		 this.sections.put(section, adapter);  
          }  
    	 //Renvoi la position d'un clique
    	  public Object getItem(int position) {  
    		        for(Object section : this.sections.keySet()) {  
    		            Adapter adapter = sections.get(section);  
    		           int size = adapter.getCount() + 1;  
     
    		          // récupération de la position dans la section 
    		            if(position == 0) return section;  
    		            if(position < size) return adapter.getItem(position - 1);  
     
    		           // passe à la section suivant  
    		            position -= size;  
    	        }  
    		         return null;  
    	    }
    	  // renvoi le nombre d'item
    	   public int getCount() {  
               // 	total de l'ensemble des sections, plus une pour chaque tête de section
               int total = 0;  
               for(Adapter adapter : this.sections.values())  
                   total += adapter.getCount() + 1;  
               return total;  
           }  
     
           public int getViewTypeCount() {  
                int total = 1;  
               for(Adapter adapter : this.sections.values())  
                   total += adapter.getViewTypeCount();  
               return total;  
           }  
     
            public int getItemViewType(int position) {  
                int type = 1;  
                for(Object section : this.sections.keySet()) {  
                    Adapter adapter = sections.get(section);  
                    int size = adapter.getCount() + 1;  
     
                    // Récupération de la position dans la section
                    if(position == 0) return TYPE_SECTION_HEADER;  
                    if(position < size) return type + adapter.getItemViewType(position - 1);  
     
                    // passe a la section suivante moins un par l'entête 
                    position -= size;  
                    type += adapter.getViewTypeCount();  
                }  
                return -1;  
            }  
     
            public boolean areAllItemsSelectable() {  
                return false;  
            }  
     
            public boolean isEnabled(int position) {  
                return (getItemViewType(position) != TYPE_SECTION_HEADER);  
            } 
     
     
     
            public View getView(int position, View convertView, ViewGroup parent) {  
                int sectionnum = 0;  
                for(Object section : this.sections.keySet()) {  
                    Adapter adapter = sections.get(section);  
                    int size = adapter.getCount() + 1;  
     
                    // Récupération de la position dans la section  
                    if(position == 0) return headers.getView(sectionnum, convertView, parent);  
                    if(position < size) return adapter.getView(position - 1, convertView, parent);  
     
                    // otherwise jump into next section  
                    position -= size;  
                    sectionnum++;  
                }
                return null;  
            }  
     
     
            public long getItemId(int position) {  
                return position;  
            }  
    }
    Classe principale qui implémente l'adapter de la listview a l'aide de ListSeparer :

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    public class ListBC2 extends Activity implements OnItemClickListener {
     
    	DBAdapter db;
    	ListView listview;
    	int tailleCursor;
    	int i = 0;
    	int id;
    	RelativeLayout cadreCouleur;
    	ImageView imageViewE;
    	LinearLayout cadreLegende;
    	TextView c;
    	int v;
     
    	ArrayList<Integer> returnedValueId = new ArrayList<Integer>();
    	ArrayList<Integer> returnedValueNumero = new ArrayList<Integer>();
    	ArrayList<String> returnedValueHD = new ArrayList<String>();
    	ArrayList<String> returnedValueVD = new ArrayList<String>();
     
    	ListSeparer adapter;
    	Map<String,String> bc;
     
    	public Map<String,?> createBC(int id, int numero, String heure_depart, String ville_depart, String heure_arrivee, String ville_arrivee, String destination, int nb_pers_prev, int id_chauffeur) {  
    		bc = new HashMap<String,String>();
    		bc.put("id", String.valueOf(id));
    		bc.put("numero", String.valueOf(numero));
    		bc.put("heure_depart", heure_depart);  
    		bc.put("ville_depart", ville_depart);
    		return bc;  
    	} 
     
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.listbc);
    		Intent thisIntent = getIntent();
    		id= thisIntent.getExtras().getInt("id");
     
    		listview = ((ListView)this.findViewById(R.id.listview));
    		cadreLegende = ((LinearLayout)this.findViewById(R.id.cadreLegende));
    		chauffeur = ((TextView)this.findViewById(R.id.chauffeur));
    		db = new DBAdapter(this);
            db.open();
            try {
    			DataBind();
    		} catch (ParseException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    //        listview.setBackgroundColor(android.graphics.Color.GREEN); 
    	}
     
        public void DataBind() throws ParseException{
        	Cursor c2 = db.recupererChauffeur(String.valueOf(id_chauffeur));
        	startManagingCursor(c2);
        	c2.moveToFirst();
        	chauffeur.setText(c2.getString(1)+" "+c2.getString(2));
     
        	Cursor c = db.recupererInfoBC();
        	startManagingCursor(c);
        	if (c != null) {
    		    while(c.moveToNext()) {
    		    	returnedValueId.add(c.getInt(0));
    		    	returnedValueNumero.add(c.getInt(1));
    		    	returnedValueHD.add(c.getString(2));
    		    	returnedValueVD.add(c.getString(3));
    		    }
        	}
        	Integer[] valueId = returnedValueId.toArray(new Integer[returnedValueId.size()]);
    	    Integer[] valueNumero = returnedValueNumero.toArray(new Integer[returnedValueNumero.size()]);    	
            String[] valueHD = returnedValueHD.toArray(new String[returnedValueHD.size()]);
            String[] valueVD = returnedValueVD.toArray(new String[returnedValueVD.size()]);
        	adapter = new ListSeparer(this);
        	List<Map<String,?>> today = new LinkedList<Map<String,?>>();
        	List<Map<String,?>> tomorrow = new LinkedList<Map<String,?>>();
        	List<Map<String,?>> aftertomorrow = new LinkedList<Map<String,?>>();
     
        	i=0;
            while(i < valueNumero.length)
            {
            	if(valueDateDep[i].equals("2012-05-07"))
            	{
            		today.add(createBC(valueId[i], valueNumero[i], valueHD[i], valueVD[i])); 
            	}
            	i++;
            }
            i=0;
            while(i < valueNumero.length)
            {
            	if(valueDateDep[i].equals("2012-04-25"))
            	{
            		tomorrow.add(createBC(valueId[i], valueNumero[i], valueHD[i], valueVD[i])); 
            	}
            	i++;
            }
            i=0;
            while(i < valueNumero.length)
            {
            	if(valueDateDep[i].equals("2012-05-14"))
            	{
            		aftertomorrow.add(createBC(valueId[i], valueNumero[i], valueHD[i])); 
            	}
            	i++;
            }
     
            adapter.addSection("Aujourd'hui", new SimpleAdapter(this, today, R.layout.recup_listinfobc, 
            		new String[]{"numero", "heure_depart", "ville_depart"}, 
            		new int[]{R.id.textNumeroBC, R.id.textHeureDepart, R.id.textVilleDepart}));
     
            adapter.addSection("Demain", new SimpleAdapter(this, tomorrow, R.layout.recup_listinfobc, 
                    new String[]{"numero", "heure_depart", "ville_depart"}, 
                    new int[]{R.id.textNumeroBC, R.id.textHeureDepart, R.id.textVilleDepart}));
     
            adapter.addSection("Après demain", new SimpleAdapter(this, aftertomorrow, R.layout.recup_listinfobc, 
                    new String[]{"numero", "heure_depart", "ville_depart"}, 
                    new int[]{R.id.textNumeroBC, R.id.textHeureDepart, R.id.textVilleDepart}));
        	listview.setAdapter(adapter);
        	listview.setOnItemClickListener(this);
        }
     
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        	Map<String, String> itemSelect = (Map<String, String>) a.getItemAtPosition(position);
        	Intent intent = new Intent(getBaseContext(), BC.class);
        	intent.putExtra("id", Integer.valueOf(itemSelect.get("id")));
        	startActivity(intent); 
        }
     
    	@Override
    	protected void onDestroy() {
    		// TODO Auto-generated method stub
    		super.onDestroy();
    		db.close();
    	}
    }
    Mes objets sont créer avec le layout recup_listinfobc.xml comme on peut le voir, il est composer d'un relativeLayout

    J'aimerais savoir ce que je dois ajouter et ou je dois le mettre le code qui me permettrais en fonction de l'id de changer la couleur de fond de ce relativeLayout.

    RelativeLayout cadreCouleur = ((RelativeLayout )this.findViewById(R.id.cadreCouleur ));

    if ( id = ? ) alors cadreCouleur.setBackgroundColor(android.graphics.Color.BLACK);

    Mais je ne sais pas ou influer sur le layout qui est utiliser pour construire chaque objet.

  10. #10
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Hey mais tu serais pas en train de remplir des ArrayList avec un Cursor ?

    Tu fais des étapes inutiles et lourde pour rien.

    Fais quelque chose de simple comme ça:
    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
    public class MonAdapter extends CursorAdapter{
         private Cursor mCursor;
         private LayoutInflater mInflater;
     
         public MonAdapter(Context context, Cursor cursor) {
              super(context, cursor);
              mInflater = LayoutInflater.from(context); 
         }
     
         @Override
         public View getView(int position, View convertView, ViewGroup parent){
              Cursor cursor = getCursor();
              cursor.moveToPosition(position);
     
              LinearLayout layoutItem;
     
              if (convertView == null) {
                   layoutItem = (LinearLayout) mInflater.inflate(R.layout.layout, parent, false);
              } else {
                   layoutItem = (LinearLayout) convertView;
              }
     
              return layoutItem;
         }
     
         @Override
         public void bindView(View view, Context context, Cursor cursor) {
         }
     
         @Override
         public View newView(Context context, Cursor cursor, ViewGroup parent) {
              return null;
         }
     
    }
    Si tu veux une info, tu fais cursor.getString(0), cursor.getInt(0), cursor.getLong(0), etc...

    Comme tu veux.

    Et selon le résultat tu peux modifier layoutItem, bon toi ce sera un RelativeLayout au lieu d'un LinearLayout mais ça changera rien.

    Là c'est quand même beaucoup plus simple.
    Tu n'as qu'a faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new MonAdapter(this, cursor);
    et c'est fini.
    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
    Je suis désolé mais je n'ai pas la possibilité de modifier ces parties de code. Je recherche une solution en accord avec le code que j'ai joint pas une solution pour refaire.

    Dans le code que j'ai joint il y a déjà une méthode getView mais elle ne correspond pas.

    Il 'y a donc aucun moyen de faire ce que je veux avec ce code ?

  12. #12
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Si mais tu as compliqué les choses pour rien.

    Dans ton getView, tu as un layout à modifié.
    Tu as une position, qui te permet de récupérer les informations de l'item dans tes ArrayList.

    Tu n'as qu'a modifié cette layout en fonction des données, je comprend pas quel est le problème.

    Tes données sont dans un LinkedHashMap<String,Adapter>() ?

    C'est chiant les HashMap...

    A la base tu voulais juste remplir une ListView avec un Cursor et personnaliser chaque item de la liste et tu t'es retrouvé avec ça ?
    Keith Flint 1969 - 2019

  13. #13
    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
    Au final la listview est remplie pas par un cursor mais grace au arraylist aprce qu'il y a des catégories et chaque élément va dans une catégorie précise suivant une valeur dans l'arraylist. C'est pour ça que le cursor est transformer en arraylist je crois.

    Je ne peux pas supprimer ce code actuellement je dois juste le modifier pour qu'il fasse quelque chose en plus c'est que suivant une autre valeur dans l'arraylist les fond de chaque item doivent être de couleur différente.

    Ma méthode getView est la suivante je la remet :

    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
    public View getView(int position, View convertView, ViewGroup parent) {  
                int sectionnum = 0;  
                for(Object section : this.sections.keySet()) {  
                    Adapter adapter = sections.get(section);  
                    int size = adapter.getCount() + 1;  
     
                    // Récupération de la position dans la section  
                    if(position == 0) return headers.getView(sectionnum, convertView, parent);  
                    if(position < size) return adapter.getView(position - 1, convertView, parent);  
     
                    // otherwise jump into next section  
                    position -= size;  
                    sectionnum++;  
                }
                return null;  
            }
    Elle ne resemble pas vraiment a la getview que vous montriez en exemple.
    Il n'y a pas d'arraylist en paramètre et je ne vois pas comment appeler le layout précis qui doit être modifier pour chaque item.

  14. #14
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Dans ton Adapter tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    public final Map<String,Adapter> sections = new LinkedHashMap<String,Adapter>();  
    public final ArrayAdapter<String> headers;
    Dans ton getView tu parcours sections.
    Selon la size() de l'adapter que tu regardes tu retournes pas la même vue.

    Après les views sont soit dans headers soit dans un Adapter dans section.

    Tu veux pas toujours la même ligne mais tu changes la couleur ?
    Tu boss sur un projet qu'existe déjà ?
    Keith Flint 1969 - 2019

  15. #15
    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
    Oui je travaille sur un projet existant.

    Ce que je veux c'est que lorsque je créer les élément ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    i=0;
            while(i < valueNumero.length)
            {
            	if(valueDateDep[i].equals(date))
            	{
            		today.add(createBC(valueId[i], valueNumero[i], valueHD[i], valueVD[i])); 
            	}
            	i++;
            }  
    adapter.addSection("titre", new SimpleAdapter(this, today, R.layout.recup_listinfobc, 
            		new String[]{"numero", "heure_depart", "ville_depart", }, 
            		new int[]{R.id.textNumeroBC, R.id.textHeureDepart, R.id.textVilleDepart}));
    listview.setAdapter(adapter);
    Si une valeur de la listview est égale a une valeur voulu par exemple si valueNumero[i] = 3 alors le Relativelayout de R.layout.recup_listinfobc.xml ai un fond rouge.

    mais je ne peux visiblement pas le modifier ici.

  16. #16
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Tu peux pas contacter le type qu'a développé ça à la base, qu'il t'explique ce qu'il fait exactement ?

    Il faut que dans getView tu puisses avoir accès à ton valueNumero[i].

    Ensuite tu retournes une view il faudrait juste faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    View view = headers.getView(sectionnum, convertView, parent);  
    //Ou :
    View view = adapter.getView(position - 1, convertView, parent);
     
    //En théorie tu peux faire
    view.setBackgroundColor(Color.MAGENTA);
     
    return view;
    Enfin après c'est si
    position == 0 ou position < size.

    J'ai pas envie de comprendre c'est quoi la size d'un Adapter contenu dans un LinkedHashMap <String, Adapter>...

    T'es dans la méthode getView d'un Adapter et t'appelles la méthode getView d'un autre Adapter.

    C'est quoi cette liste d'Adapter déjà ?

    Essaie de mettre des System.out.println() ou des Log.v("", ""); partout pour essayer de comprendre ce qu'il ce passe morceau par morceau.
    Parce que comprendre tout le système d'un coup c'est chaud.
    Keith Flint 1969 - 2019

  17. #17
    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
    Le tuto qui a été suivit est celui ci par mon prédécesseur est celui-ci, à la lettre :

    http://jsharkey.org/blog/2008/08/18/...in-android-09/

    Imaginons que dans le tuto on veuille mettre les objets qui ont une une petite description sous le titre, en couleur. C'est le Caption dans le tuto (item.put(ITEM_CAPTION, caption); )

    C'est ça que je veux réaliser.

  18. #18
    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,

    Alors j'ai finalement réussis a avoir se que je voulais en suivant le code que vous m'aviez donné pour colorer les objets nickel.

    Mais alors par contre pour récupérer la donnée du curseur pour la comparer dans getview ça ne marche pas du tout...

    J'ai mis ceci dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public ListSeparer(Context context) {
                   //pour les entetes j'utilise le fichier list_header.xml
    		headers = new ArrayAdapter<String>(context, R.layout.list_header); 
    		db = new DBAdapter(context);
            db.open();
            c = db.recupererInfoBC();
            c.moveToFirst();
    	}
    et ma fonction getview :

    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
    public View getView(int position, View convertView, ViewGroup parent) {  
                int sectionnum = 0;  
                c.moveToPosition(position);
                Log.d("test",c.getString(1));
                for(Object section : this.sections.keySet()) {  
                    Adapter adapter = sections.get(section);  
                    int size = adapter.getCount() + 1;  
     
                    // Récupération de la position dans la section  
                    if(position == 0)
                    {
                    	View view = headers.getView(sectionnum, convertView, parent);
     
                    	return view;
                    }
                    if(position < size)
                    {
                    	View view = adapter.getView(position - 1, convertView, parent);  
                    	cadreCouleur = ((RelativeLayout)view.findViewById(R.id.cadreCouleur));
     
                    	if(c.getString(9).equals("null") && c.getString(10).equals("null"))
        		        {
                    		cadreCouleur.setBackgroundColor(android.graphics.Color.WHITE);
        		        }
        		        else if(!(c.getString(9).equals("null")) && c.getString(10).equals("null"))
        		        {
        		        	cadreCouleur.setBackgroundColor(android.graphics.Color.parseColor("#F99DA6"));
        		        }
        		        else if(!(c.getString(9).equals("null")) && !(c.getString(10).equals("null")))
        		        {
        		        	cadreCouleur.setBackgroundColor(android.graphics.Color.parseColor("#A4F7A4"));
        		        }
     
    //                	cadreCouleur.setBackgroundColor(android.graphics.Color.parseColor("#F99DA6"));
                    	return view;
                    }
                    // otherwise jump into next section  
                    position -= size;  
                    sectionnum++;  
                }
                return null;  
            }
    J'ai mis un Log.d sur les valeur retournée qui devrait correspondre au a tout les numéro de mes objets, j’obtiens une liste de numéro bien plus grande que les objets que j'ai parce qu'il se répètent et ils sont dans le désordre...

    Du coup lorsque je lance l'appli, elle s'ouvre affiche les quelques ligne du dessus dans la mauvaise couleur et si je fait défiler, l'appli plante, de plus lors du défilement je continue a recevoir une liste de numéro.

  19. #19
    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
    En retirant le c.moveToFirst du constructeur en fait j'obtiens bien la liste de mes objets mais ça plante juste après, j'ai tout les numéros et ensuite un CursorIndexOutOfException Index 7 requested, with a size of 7...

  20. #20
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    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 605
    Points : 18 523
    Points
    18 523
    Par défaut
    C'est à la ligne de c.moveToPosition(position); que ça plante ?

    Parce que normalement c'est impossible.
    T'utilises quoi comme Adapter ?
    Si c'est un Cursor Adapter normalement il y a le super constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    super(context, cursor);
    Sinon il y a :
    getCount()

    Chez toi ça devrait faire :
    Keith Flint 1969 - 2019

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. ListView, SimpleAdapter, Image
    Par jbidou88 dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 26/03/2013, 21h15
  2. Passage d'un SimpleAdapter à un ArrayAdapter
    Par VB 2008 dans le forum Android
    Réponses: 3
    Dernier message: 04/10/2012, 09h38
  3. SimpleAdapter; et setVisibility(View.GONE) ?
    Par amy0o0 dans le forum Composants graphiques
    Réponses: 12
    Dernier message: 15/02/2012, 15h04
  4. SimpleAdapter avec images distantes
    Par Zero dans le forum Android
    Réponses: 14
    Dernier message: 27/07/2011, 01h02
  5. Réponses: 2
    Dernier message: 21/02/2011, 17h00

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