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 :

Colorer certains éléments d'une array adapter


Sujet :

Android

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 154
    Points : 87
    Points
    87
    Par défaut Colorer certains éléments d'une array adapter
    Bonjour a tous, voilà j'ai actuellement un bouton qui me permet de lire un fichier XLS et le me l'afficher dans un popups avec le code suivent:

    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
        private boolean LireFichier(Context context, String fileName) {
            ///Alletre dialogue OK
            AlertDialog.Builder builderSingle = new AlertDialog.Builder(Inter.this);
            builderSingle.setIcon(R.drawable.ordre);
            builderSingle.setTitle("Ordre envoyer jusqu'à présent");
     
     
    ///////////////////////////////////////////////////////
           // Lecture du fichier
            /////////////////Variable
            final int mois = d.getMonth() + 1;
            final int annees = d.getYear() - 100;
            final int jours = d.getDate();
            final String datesok = jours + "." + mois + "." + annees;
     
            // check if available and not read only
            if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
                Log.w("FileUtils", "Storage not available or read only");
                return false;
            }
     
            boolean success = false;
     
            //New Workbook
            // Create a path where we will place our List of objects on external storage
            //  File file = new File(context.getExternalFilesDir(null), fileName);
            FileOutputStream os = null;
            FileInputStream file = null;
            try {
                file = new FileInputStream(new File(context.getExternalFilesDir(null), fileName));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
     
            HSSFWorkbook wb = null;
            try {
                wb = new HSSFWorkbook(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            // Workbook wb = new HSSFWorkbook();
     
            Cell c = null;
     
            //New Sheet
            HSSFSheet sheet1 = wb.getSheetAt(0);
     
            // Generate column headings
            int rownum = sheet1.getLastRowNum()+1;
            //////////////////////////////
            //Update the value of cell
     
            //  Row row = sheet1.getRow(0);
            //  row.createCell(3).setCellValue("Value 2");
            /////////////////////////////////
            Row row = sheet1.createRow(rownum);
            //Row row1 = sheet1.createRow(1);
    ////////////////////////////////////////////////A faire Ici
            ///Conteur du nombre de cell
            int counter =0;
            //String Cellule(counter);
            Iterator<Row> rowIter = sheet1.rowIterator();
            ArrayList<String> ArrayFichier=new ArrayList<String>();
            final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ArrayFichier);
           // liste.setAdapter(adapter);
    ///////Fin de la créatuon de la listeview
            while (rowIter.hasNext()) {
                ArrayList<String> ArrayLigne=new ArrayList<String>();
                //Création de la row
                HSSFRow myRow = (HSSFRow) rowIter.next();
                //HSSFRow test =(HSSFRow) rowIter.next()+1;
                Iterator<Cell> cellIter = myRow.cellIterator();
     
                while (cellIter.hasNext()) {
     
                    HSSFCell myCell = (HSSFCell) cellIter.next();
                    Log.w("FileUtils", "Cell Value: " + myCell.toString());
                    //////////////////////ajouter les 4 premiere cellule dans la ligne
                    if(counter < 4){
                        ArrayLigne.add (String.valueOf(myCell));
                        counter++;
                    }else{
                        //Compter les 11 autre et ne rien faire avec
                        if(counter < 11){
                            counter++;
                        }else{
                            ArrayFichier.add (String.valueOf(ArrayLigne));
                            counter =0;
                        }
     
                    }
     
                }
     
            }
     
            ////////////////////////////////////////////////
            //Affichage du popup
            builderSingle.setNegativeButton(
                    "fermer",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
     
            builderSingle.setAdapter(
                    (ListAdapter) adapter,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            String strName = adapter.getItem(which);
                            AlertDialog.Builder builderInner = new AlertDialog.Builder(
                                    Inter.this);
                        }
                    });
            builderSingle.show();
     
     
            return success;
        }
    tous ceci fonctionne très bien mais maintenant je voudrait savoir si il est possible de colorer le texte afficher d'une ou plusieurs ligne défini avec couleur spécifique... est ce que dans l'arrayadaper il y a une option comme ceci?

    Merci d'avance pour votre aide!

  2. #2
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    Il te faut créer une sous-classe de ArrayAdapter et redéfinir la méthode getView() pour gérer ton cas spécifique.
    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 confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Je dirais même plus, dans l'adapter personnalisé que tu devra créer, il faudra surcharger 2 méthodes :
    public int getItemViewType(int position)
    pour préciser les conditions des différents types de vue
    et
    public int getViewTypeCount()
    pour indiquer le nombre de vue différentes. Pas le nombre de ligne de la liste mais le nombre de couleurs différentes dans ton cas

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 154
    Points : 87
    Points
    87
    Par défaut
    Merci pour vos réponses!!

    Alors je suis débutant en dev donc si je comprend bien avec la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int getItemViewType(int position)
    Je sélectionner le numéro de la ligne que je veux "colorier"!,

    Et avec la ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public int getViewTypeCount()
    je définir les changement que je souhaite affecter!?


    En gros pour ma situation precise je voudrait que tous le texte sois afficher de manière "normal text noir fond blanc" et que les lignes contenant le.mot quittancé sois affiché en rouge!!

    Donc la je fait un if par exemple pour tester toutes mes lignes et que si il y a un quittance je note le numéro de la ligne, je note cette/ces lignes dans la première ligne de code jusqu'à ici je comprends mais pour la deuxième j'ai du mal à comprendre à comprendre comment définir les changement de mon array dans cette ligne...

    Merci d'avance pour vos éclairage!

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    Non, c'est pas ca du tout. getViewTypeCount() renvoie le nombre de vues différentes dans ta liste, dans ton cas 2 (car tu as des textes en normal noir fond blanc, et textes en rouge), et dans getItemViewType, tu définis la condition.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     @Override
        public int getItemViewType(int position) {
            if (getItem(position).contains("quittancé")) {
                        return 1;
                    } else {
                    return 0;
                }
        }
     
        @Override
        public int getViewTypeCount() {
            return 2;
        }
    Tu crées un layout qui représente la vue des items (dans ton cas un simple textview avec fond blanc).
    puis dans ta méthode 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
      @Override
        public android.view.View getView(int position, View convertView, ViewGroup parent) {
            int i = getItemViewType(position);
           
                if (convertView == null) {
    
                    convertView = android.view.LayoutInflater.from(context).inflate(
                            ton_layout_item, parent, false);
                }
    
            TextView text = ViewHolder.get(convertView, R.id.monTexte);
            text.setText(getItem(position);
            
            if (i == 1) {
             text.setTextColor(Color.RED);
            }
            return convertView;
        }
    J'ai recopié ca vite fait d'un adapter de recycleview, donc y a p'tet qq différences, mais voila comment ca marche. Regarde comment faire un custom adapter, comme ici (http://www.piwai.info/android-adapter-good-practices), puis tu surcharges les 2 méthodes citées. Si tu rentres la condition uniquement dans la getView sans surcharger les 2 méthodes (car elles sont facultatives), ca va marcher jusqu'à ce que tu t'amuses à scroller ta liste. Et là ton texte va devenir rouge aléatoirement sur d'autres lignes.

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 154
    Points : 87
    Points
    87
    Par défaut
    Magnifique tu est un chef!

    je commence petit a petit a comprendre!

    maintenant j'ai un souci par ce que je n'ai pas une simple array toute créer je la compose grâce a un clique sur un bouton qui va lire un fichier xls voici le code:

    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
        private boolean LireFichier(Context context, String fileName) {
            ///Alletre dialogue OK
            final AlertDialog.Builder builderSingle = new AlertDialog.Builder(Inter.this);
            builderSingle.setIcon(R.drawable.ordre);
            builderSingle.setTitle("Ordre envoyer jusqu'à présent");
     
     
    ///////////////////////////////////////////////////////
           // Lecture du fichier
            /////////////////Variable
            final int mois = d.getMonth() + 1;
            final int annees = d.getYear() - 100;
            final int jours = d.getDate();
            final String datesok = jours + "." + mois + "." + annees;
     
            // check if available and not read only
            if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) {
                Log.w("FileUtils", "Storage not available or read only");
                return false;
            }
     
            boolean success = false;
     
            //Création du fichier excel
            FileOutputStream os = null;
            FileInputStream file = null;
            try {
                file = new FileInputStream(new File(context.getExternalFilesDir(null), fileName));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
     
            HSSFWorkbook wb = null;
            try {
                wb = new HSSFWorkbook(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Cell c = null;
            HSSFSheet sheet1 = wb.getSheetAt(0);
            // trouver la derniere row
            int rownum = sheet1.getLastRowNum()+1;
            Row row = sheet1.createRow(rownum);
            ///Conteur du nombre de cell
            int counter =0;
            Iterator<Row> rowIter = sheet1.rowIterator();
            ArrayList<String> ArrayFichier=new ArrayList<String>();
            final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, ArrayFichier);
    ///////Fin de la créatuon de la listeview
            while (rowIter.hasNext()) {
                ArrayList<String> ArrayLigne=new ArrayList<String>();
                //Création de la row
                HSSFRow myRow = (HSSFRow) rowIter.next();
                //HSSFRow test =(HSSFRow) rowIter.next()+1;
                Iterator<Cell> cellIter = myRow.cellIterator();
     
     
     
                while (cellIter.hasNext()) {
     
                    HSSFCell myCell = (HSSFCell) cellIter.next();
                    Log.w("FileUtils", "Cell Value: " + myCell.toString());
                    //////////////////////ajouter les 4 premiere cellule dans la ligne
                    if(counter < 4){
                        ArrayLigne.add (String.valueOf(myCell));
                        counter++;
                    }else{
                        //Compter les 11 autre et ne rien faire avec
                        if(counter < 11){
                            counter++;
                        }else{
                            ArrayFichier.add (String.valueOf(ArrayLigne));
                            counter =0;
                        }
     
                    }
     
                }
     
            }
     
            ////////////////////////////////////////////////
            //Affichage du popup
            builderSingle.setNegativeButton(
                    "fermer",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
     
     
            builderSingle.setAdapter(
     
                    (ListAdapter) adapter,
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
     
                            String strName = adapter.getItem(which);
                            AlertDialog.Builder builderInner = new AlertDialog.Builder(
                                    Inter.this);
                        }
                    });
           // builderSingle.setBackgroundColor(Color.GREEN);
            builderSingle.show();
     
     
            return success;
        }
    et plus precisement ce bout ci:

    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
                while (cellIter.hasNext()) {
     
                    HSSFCell myCell = (HSSFCell) cellIter.next();
                    Log.w("FileUtils", "Cell Value: " + myCell.toString());
                    //////////////////////ajouter les 4 premiere cellule dans la ligne
                    if(counter < 4){
                        ArrayLigne.add (String.valueOf(myCell));
                        counter++;
                    }else{
                        //Compter les 11 autre et ne rien faire avec
                        if(counter < 11){
                            counter++;
                        }else{
                            ArrayFichier.add (String.valueOf(ArrayLigne));
                            counter =0;
                        }
     
                    }
     
                }
    en gros je récupéré les 4 cellule que je veux afficher de chaque ligne pour les placer dans ArrayLigne puis après avoir laisser les autre cellules sans importance je place cette ligne dans mon arrayFichier.

    est ce que je voudrait moi c'est de colorier uniquement l'ArrayLigne si une des quatre cellule contient quittancé...

    est ce que c'est fesable? car apres je met le toute dans l'arrayfichier...

    Merci d'avance pour ton aide précieuse!

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 586
    Points
    586
    Par défaut
    C'est faisable mais tu n'utilises pas la bonne méthodes car la gestion des vues de la liste se fait dans l'adapter, pas dans l'activité.

    Donc tu dois absolument faire un adapter personnalisé, un peu comme dans cet exemple : http://www.piwai.info/android-adapter-good-practices. Tu trouveras d'autres exemples rapidement et en français en cherchant un peu
    Il te faudra alors un layout pour les vues des lignes, et dans ton cas, ca sera un linearlayout d'orientation horizontal avec 4 textview qui correspondent à tes 4 cellules par lignes.

    Tu n'as plus qu'à surcharger les 2 méthodes décrites précédemment et utiliser getView comme expliqué pour rendre ton texte rouge si besoin.
    Enfin dans l'activité, tu créés une arraylist ou map depuis ton xml et tu rentres associe cette liste à l'adapter.

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2014
    Messages : 154
    Points : 87
    Points
    87
    Par défaut
    Ok alors je vais y aller par étape, je vais déjà commencer a mettre en place sur une listeview normal le système que tu as poster plus haut!

    je l'ai mis en place voici le code:

    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
                final ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, ArrayFichier){
                    ArrayList<Integer> ArrayOrdre=new ArrayList<>();
                    //affichage du rouge ou du vert
                    final String quittance = String.valueOf(cellQuittance);
                    // String quittance = null;
                    //quittance = cell.getStringCellValue();
     
                    @Override
                    public int getItemViewType(int position) {
                        if ( "NON".equals(quittance) ) {
                            return 1;
                        } else {
                            return 0;
                        }
                    }
     
                    @Override
                    public int getViewTypeCount() {
                        return 2;
                    }
     
     
     
                    @Override
                    public android.view.View getView(int position, View convertView, ViewGroup parent) {
                        int i = getItemViewType(position);
     
                        if (convertView == null) {
     
                            convertView = android.view.LayoutInflater.from(context).inflate(
                                    android.R.layout.simple_list_item_multiple_choice, parent, false);
                        }
     
                        TextView text = RecyclerView.ViewHolder.get(convertView, R.id.monTexte);
                        text.setText(getItem(position);
     
                        if (i == 1) {
                            text.setTextColor(Color.RED);
                        }
                        return convertView;
                    }
                };
                liste.setAdapter(adapter1);
     
            }
     
            return success;
     
     
        }
    seulement voila je ne vois pas ou est ce que je peut y inserer mon text qui ce trouve dans une array (ArrayFichier) dans cette emplacement:

    TextView text = RecyclerView.ViewHolder.get(convertView, R.id.monTexte);
    text.setText(getItem(position);
    ou alors je n'ai a nouveau rien compris je ne suis pas sur de comprendre totalement la manipulation du deuxieme code que tu m'as montrer avec le recyclerview...

    Merci d'avance est navrer de ne pas tout comprendre !

Discussions similaires

  1. Appliquer une bordure et un fond coloré à certains éléments
    Par laurentSc dans le forum Mise en page CSS
    Réponses: 14
    Dernier message: 19/11/2015, 13h48
  2. Récupération de certains éléments d'une BDD
    Par DaisyVIP dans le forum ASP.NET
    Réponses: 27
    Dernier message: 08/06/2007, 15h20
  3. Réponses: 4
    Dernier message: 24/05/2007, 16h37
  4. Réponses: 2
    Dernier message: 29/03/2007, 10h18

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