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 :

Patron Wrapper eviter FindViewById() et syntax


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut Patron Wrapper eviter FindViewById() et syntax
    Bonjour,

    Voici une code source, dont la source est : l'art du développement Android chez Pearson. Bon je ne ferai pas de critique sur le livre ici.
    Voici le code d'un des exemple j'espère que je peu le mettre malgres tout pour avoir quelques explications ( j'aurai pu le modifier pour cacher sa provenance mais je sollicite leur agrément vu que leurs explications ne m'ont pas suffi.)

    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
    /***
            Copyright (c) 2008-2009 CommonsWare, LLC
            
            Licensed under the Apache License, Version 2.0 (the "License"); you may
            not use this file except in compliance with the License. You may obtain
            a copy of the License at
                    http://www.apache.org/licenses/LICENSE-2.0
            Unless required by applicable law or agreed to in writing, software
            distributed under the License is distributed on an "AS IS" BASIS,
            WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
            See the License for the specific language governing permissions and
            limitations under the License.
    */
     
    package com.commonsware.android.fancylists.five;
     
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
     
    class ViewWrapper {
    	View base;
    	TextView label=null;
    	ImageView icon=null;
     
    	ViewWrapper(View base) {
    		this.base=base;
    	}
     
    	TextView getLabel() {
    		if (label==null) {
    			label=(TextView)base.findViewById(R.id.label);
    		}
     
    		return(label);
    	}
     
    	ImageView getIcon() {
    		if (icon==null) {
    			icon=(ImageView)base.findViewById(R.id.icon);
    		}
     
    		return(icon);
    	}
    }
    ainsi que 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
    //***
        Copyright (c) 2008-2009 CommonsWare, LLC
     
        Licensed under the Apache License, Version 2.0 (the "License"); you may
        not use this file except in compliance with the License. You may obtain
        a copy of the License at
            http://www.apache.org/licenses/LICENSE-2.0
        Unless required by applicable law or agreed to in writing, software
        distributed under the License is distributed on an "AS IS" BASIS,
        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
        See the License for the specific language governing permissions and
        limitations under the License.
    */
     
    package com.commonsware.android.fancylists.five;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.app.ListActivity;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.LayoutInflater;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
     
    public class ViewWrapperDemo extends ListActivity {
        TextView selection;
        String[] items={"lorem", "ipsum", "dolor", "sit", "amet",
                        "consectetuer", "adipiscing", "elit", "morbi", "vel",
                        "ligula", "vitae", "arcu", "aliquet", "mollis",
                        "etiam", "vel", "erat", "placerat", "ante",
                        "porttitor", "sodales", "pellentesque", "augue",
                        "purus"};
     
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);
            setListAdapter(new IconicAdapter());
            selection=(TextView)findViewById(R.id.selection);
        }
     
        private String getModel(int position) {
            return(((IconicAdapter)getListAdapter()).getItem(position));
        }
     
        public void onListItemClick(ListView parent, View v,
                                                                int position, long id) {
             selection.setText(getModel(position));
        }
     
        class IconicAdapter extends ArrayAdapter<String> {
            IconicAdapter() {
                super(ViewWrapperDemo.this, R.layout.row, items);
            }
     
            public View getView(int position, View convertView,
                                                    ViewGroup parent) {
                View row=convertView;
                ViewWrapper wrapper=null;
     
                if (row==null) {                                                    
                    LayoutInflater inflater=getLayoutInflater();
     
                    row=inflater.inflate(R.layout.row, parent, false);
                    wrapper=new ViewWrapper(row);
                    row.setTag(wrapper);
                }
                else {
                    wrapper=(ViewWrapper)row.getTag();
                }
     
                wrapper.getLabel().setText(getModel(position));
     
                if (getModel(position).length()>4) {
                    wrapper.getIcon().setImageResource(R.drawable.delete);
                }    
                else {
                    wrapper.getIcon().setImageResource(R.drawable.ok);
                }
     
                return(row);
            }
        }
    }
    question : je ne comprends pas le fonctionnement de ce programme pourtant basique. J'ai lu la doc sur les tags. Mais ne saisis pas le wrapper. contient-il plusieurs tags d'objets de même type ou seulement un des cas possible? Où sont stocker ces infos s'il existe plusieurs instances?

    la j'ai du raté quelque chose si quelqu'un peu m'aider pour cette énigme. Merci d'avance.

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Le Wrapper c'est juste une View qui contient un texte et une image

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    View base;
    	TextView label=null;
    	ImageView icon=null;

    Après la seconde class c'est une List Activity a laquelle il greffe le wrapper comme modèle de représentation des lignes de cette liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              row=inflater.inflate(R.layout.row, parent, false);
              wrapper=new ViewWrapper(row);
              row.setTag(wrapper);
    public void setTag (Object tag)
    Since: API Level 1

    Sets the tag associated with this view. A tag can be used to mark a view in its hierarchy and does not have to be unique within the hierarchy. Tags can also be used to store data within a view without resorting to another data structure.
    Parameters
    tag an Object to tag the view with
    See Also

    * getTag()
    * setTag(int, Object)
    Quant au infos elles sont stocké en mémoire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    Merci Feanorin pour tes explications.

    Je dois avouer que je ne comprends toujours pas très bien les Tag.
    En fait je pensais qu'il servait à retrouver les deux icons pour éviter d'aller les chercher avec la fonction 'findViewById' qui est plus lourde.
    Mais je ne comprends pas comment il sait que c'est la bonne. enfin si c'est le cas.

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Citation Envoyé par espritlune Voir le message
    Merci Feanorin pour tes explications.

    Je dois avouer que je ne comprends toujours pas très bien les Tag.
    En fait je pensais qu'il servait à retrouver les deux icons pour éviter d'aller les chercher avec la fonction 'findViewById' qui est plus lourde.
    Mais je ne comprends pas comment il sait que c'est la bonne. enfin si c'est le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
               wrapper.getLabel().setText(getModel(position));
     
                if (getModel(position).length()>4) {
                    wrapper.getIcon().setImageResource(R.drawable.delete);
                }    
                else {
                    wrapper.getIcon().setImageResource(R.drawable.ok);
                }

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

Discussions similaires

  1. [Lazarus] Syntaxe d'un wrapper Pascal sous Linux
    Par ChPr dans le forum Lazarus
    Réponses: 3
    Dernier message: 25/05/2011, 14h30
  2. Eviter une syntaxe trompeuse.
    Par Mersenne dans le forum C++
    Réponses: 24
    Dernier message: 09/07/2006, 14h27
  3. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  4. Eviter deux nombres identiques dans un tirage aléatoire
    Par moon tiger dans le forum Pascal
    Réponses: 5
    Dernier message: 25/11/2002, 09h57
  5. [VB6] [Syntaxe] Fonction renvoyant un tableau d'objets
    Par Troopers dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 18/10/2002, 15h33

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