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

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

Composants graphiques Android Discussion :

Une ListView avec 2 types d'items (messages entrant et sortant)


Sujet :

Composants graphiques Android

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 67
    Points
    67
    Par défaut Une ListView avec 2 types d'items (messages entrant et sortant)
    Bonjour à tous,

    Je cherche depuis un moment comment afficher correctement ce type de ListView.
    J'ai essayé avec un seul layout dans le code suivant :

    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
     
      private class MessagesAdapter extends BaseAdapter {
     
            ArrayList<Message> listeMessages ;
     
            public MessagesAdapter(ArrayList<Message> liste) {
                this.listeMessages=liste;
            }
     
            @Override
            public int getCount() {
                return listeMessages.size();
            }
     
            @Override
            public Object getItem(int position) {
                return listeMessages.get(position);
            }
     
            @Override
            public long getItemId(int position) {
                return position;
            }
     
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
     
                ViewHolder viewHolder = null;
                int type;
     
                Message message = (Message) getItem(position);
     
                Log.i("adapter position", String.valueOf(position) + " texte " + message.getBody() + " type " + String.valueOf(message.getType()));
     
                if (convertView == null) {
     
                    convertView = lInflater.inflate(R.layout.listemessagese, null);
     
                    viewHolder = new ViewHolder();
     
                    if (message.getType() == TYPE_ENTRANT) {
                        viewHolder.mBody = (TextView) convertView.findViewById(R.id.text1);
                        viewHolder.mDate = (TextView) convertView.findViewById(R.id.text2);
                        convertView.findViewById(R.id.wrapper2).setVisibility(View.INVISIBLE);
                        convertView.findViewById(R.id.texts2).setVisibility(View.INVISIBLE);
                    } else {
                        viewHolder.mBody = (TextView) convertView.findViewById(R.id.texts1);
                        viewHolder.mDate = (TextView) convertView.findViewById(R.id.texts2);
                        convertView.findViewById(R.id.typeE).setVisibility(View.INVISIBLE);
                    }
     
                    convertView.setTag(viewHolder);
                } else{
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                    viewHolder.mBody.setText(message.getBody());
                    viewHolder.mDate.setText(convertDate(message.getDate(),"dd MMMM HH:mm  "));
     
                return convertView;
            }
        }
    Mais aussi avec 2 layout :

    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
    private class MessagesAdapter extends BaseAdapter {
     
            ArrayList<Message> listeMessages ;
     
            public MessagesAdapter(ArrayList<Message> liste) {
                this.listeMessages=liste;
            }
     
            @Override
            public int getCount() {
                return listeMessages.size();
            }
     
            @Override
            public Object getItem(int position) {
                return listeMessages.get(position);
            }
     
            @Override
            public long getItemId(int position) {
                return position;
            }
     
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
     
                ViewHolder viewHolder = null;
                int type;
     
                Message message = (Message) getItem(position);
     
                Log.i("adapter position", String.valueOf(position) + " texte " + message.getBody() + " type " + String.valueOf(message.getType()));
     
                if (convertView == null) {
                    if (message.getType() == TYPE_ENTRANT) {
                        convertView = lInflater.inflate(R.layout.listemessagese, null);
                    } else if (message.getType() == TYPE_SORTANT) {
                        convertView = lInflater.inflate(R.layout.listemessagess, null);
                    }
     
                    viewHolder = new ViewHolder();
     
                    if (message.getType() == TYPE_ENTRANT) {
                        viewHolder.mBody = (TextView) convertView.findViewById(R.id.text1);
                        viewHolder.mDate = (TextView) convertView.findViewById(R.id.text2);
                    } else {
                        viewHolder.mBody = (TextView) convertView.findViewById(R.id.texts1);
                        viewHolder.mDate = (TextView) convertView.findViewById(R.id.texts2);
                    }
     
                    convertView.setTag(viewHolder);
                } else{
                    viewHolder = (ViewHolder) convertView.getTag();
                    Log.i("recycle","texte "+ message.getBody()+" indice "+viewHolder.mDate.getHint());
                }
                    viewHolder.mBody.setText(message.getBody());
                    viewHolder.mDate.setText(convertDate(message.getDate(),"dd MMMM HH:mm  "));
     
                return convertView;
            }
        }
    Le problème vient du setTag et getTag je pense. Dans le 2ème exemple de code. J'ai dans la console affiché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    I/recycle: texte Dommage  indice type entrant
    Le texte dommage est le texte d'un message sortant c'est moi qui l'ai envoyé et il s'affiche comme message entrant. J'espère que je ne suis pas trop confus dans mon explication.
    Merci d'avance.

  2. #2
    Membre extrêmement actif
    Profil pro
    Développeur
    Inscrit en
    Mars 2012
    Messages
    1 969
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 969
    Points : 3 375
    Points
    3 375
    Par défaut
    Les getTag, setTag reconnaissent des objets simples: String, int, boolean... pas de classe objet.

    Si tu dois passer par exemple 2 valeurs, tu devras faire 2 setTag avec un resourceId field1, field2 comme 1er paramètre.
    Ex: <string name='field1'>f1</string>
    Si la réponse vous a aidé, pensez à cliquer sur +1

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 67
    Points
    67
    Par défaut
    Bonjour,
    Merci pour ta réponse mais j'ai lu dans un tuto qu'on pouvait utiliser ce genre de classes interne et statiques ( à moins que je t'ai mal compris)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     static class ViewHolder {
            public TextView mBody;
            public TextView mDate;
        }
    Je pense que le problème vient du recyclage de la vue :

    convertView ne vaut plus null, mais plutôt la valeur de la vue qui vient de disparaître de l'écran.
    Je suis pas sur d'avoir bien compris mais, le programme recycle peut être une vue de l'autre type puisque certains messages sont bien affichés.
    La solution radicale c'est de ne pas utiliser convertView mais j'aime pas trop.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 166
    Points : 67
    Points
    67
    Par défaut
    J'ai résolu le problème j'ai utilisé une seule layout et procédé de la façon suivante :

    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
     
     
    static class ViewHolder {
            public TextView mBody;
            public TextView mDate;
            public TextView mBodyS;
            public TextView mDateS;
        }
     
      @Override
        public View getView(int position, View convertView, ViewGroup parent) {
     
                ViewHolder viewHolder = null;
     
                if (convertView == null) {
     
                    convertView = lInflater.inflate(R.layout.listemessagestest, null);
     
                    viewHolder = new ViewHolder();
     
                    viewHolder.mBody = (TextView) convertView.findViewById(R.id.text1);
                    viewHolder.mDate = (TextView) convertView.findViewById(R.id.text2);
                    viewHolder.mBodyS = (TextView) convertView.findViewById(R.id.texts1);
                    viewHolder.mDateS = (TextView) convertView.findViewById(R.id.texts2);
     
                    convertView.setTag(viewHolder);
                } else
                    viewHolder = (ViewHolder) convertView.getTag();
     
     
                Message message = (Message) getItem(position);
     
                if(message.getType()==TYPE_ENTRANT) {
                    viewHolder.mBody.setText(message.getBody());
                    viewHolder.mDate.setText(convertDate(message.getDate(),"dd MMMM HH:mm  "));
                    convertView.findViewById(R.id.typeS).setVisibility(View.GONE);
                    convertView.findViewById(R.id.typeE).setVisibility(View.VISIBLE);
                }else{
                    viewHolder.mBodyS.setText(message.getBody());
                    viewHolder.mDateS.setText(convertDate(message.getDate(),"dd MMMM HH:mm  "));
                    convertView.findViewById(R.id.typeE).setVisibility(View.GONE);
                    convertView.findViewById(R.id.typeS).setVisibility(View.VISIBLE);
                }
     
                return convertView;
            }

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

Discussions similaires

  1. champ d'une table avec comme type un fichier xml
    Par gnagnus dans le forum Oracle
    Réponses: 2
    Dernier message: 05/03/2007, 10h16
  2. declarer une ArrayList avec un type precis
    Par solawe dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 30/12/2006, 20h28
  3. Remplir une ListView avec le contenu d'une requête
    Par callo dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2006, 08h44
  4. Remplir une ListView avec une BD
    Par manikou dans le forum MFC
    Réponses: 1
    Dernier message: 17/05/2005, 09h48
  5. [Composant] publier une propriété avec un type perso
    Par jpc34 dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/10/2004, 08h39

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