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 :

Perte de donnée quant je scroll sur une ListView


Sujet :

Composants graphiques Android

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut Perte de donnée quant je scroll sur une ListView
    Bonjour,
    Je continue mon projet, et vient de découvrir un problème que j'ai du mal a comprendre.
    J'ai une listview qui charge plein d'Edittext, suffisamment plein pour que je soit obligé de scroller pour remplir les éléments du dessous.
    Par contre, quant je scroll a nouveau en haut, les valeurs précédemment remplies du haut ont disparues.
    Si je re-scroll vers le bas, les éléments cachés du bas eux aussi ont disparu?

    De plus, quant j'essaye d'identifier les objets avec getChild, par exemple, sur 11 EditText existant, il n'en trouve que 8, les autres sont en NullPointException

    Avez vous une idée ?
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est le principe même d'une ListView... le recyclage des views pour éviter d'avoir 10Mo de views en mémoire.

    Si c'est gérer des checkbox, les ListView ont de base un système de multi-selection le permettant.
    Si c'est pour gérer des TextEdit par contre, il faut impérativement stocker leur valeur dès leur mise à jour. Si une validation de l'utilisateur est nécessaire après (c'est non recommandé dans les "us" d'Android, mais sait-on jamais), il faut donc les stocker dans une table temporaire.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Je comprend le principe,
    Apres quelques recherches sur le net, ils parlaient d'utiliser un ViewHolder, mais après test sur mon code, ca change rien...

    Si je mémorise les valeurs a chaque fois quelle sont saisies, bon, ok, je vois comment faire, mais comment les ré-afficher quant on scroll a nouveau ?
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  4. #4
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Un exemple (parmi d'autres je pense):

    Disons que les objets de départ sont de type "MyObject", je vais partir d'un ArrayAdapter, mais le principe est le même pour tout autre type....

    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
     
    class MyAdapter extends ArrayAdapter<MyObject>
    {
         private SparseArray<String>  editedValues;
     
         public MyAdapter(Context ctxt, MyObject[] objs)
         {
              super(ctxt,R.layout.my_edit_layout.xml,objs);
              this.editedValues = new SparseArray<String>();
         }
     
         @Override
         public View getView(int position, View convert, ViewGroup parent)
         {
               View ret = super.getView(position,convert,parent);
               // on récupère le "EditText"
               EditText edt = (EditText) ret.findViewById(R.id.my_text_edit);
     
               // il faut lui mettre les bonnes données !
               String edited = this.editedValues.get(position);
               if (edited == null) {
                   MyObject obj = getItem(position);
                   // on lui colle le texte par défaut de l'objet
                   edt.setText(obj.getText());
               } else {
                   // la valeur a été modifiée, on lui colle la valeur stockée !
                   edt.setText(edited);
               }
     
               // on lui colle un text-watcher qu'on va conserver sous le coude (Tag) pour pouvoir le supprimer si la vue est recyclée.
               TextWatcher watcher = (TextWatcher) edt.getTag();
               if (watcher != null) edt.removeTextChangedListener(watcher);
               watcher = new ListTextWatcher(position);
               edt.addTextChangedListener(watcher);
               edt.setTag(watcher);
     
               return ret;
         }
     
         // Une inner class pour le watcher:
         private class ListTextWatcher implements TextWatcher {
              int position;
     
              public TextWatcher(int p) { this.position = p; }
     
              public void    afterTextChanged(Editable s)  {
              {
                  MyAdapter.this.editedValues.put(this.position,s.toString());
              }
     
              public void    beforeTextChanged(CharSequence s, int start, int count, int after) {}
              public void    onTextChanged(CharSequence s, int start, int before, int count) {}
         }
     
    }
    et voilà....

    Le SparseArray contiendra toutes les modifications de texte effectuées...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    ok, merci je vais essayer ca dans la journée.

    Par contre, a quoi sert le ViewHolder que je vois partout ?
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  6. #6
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Le "ViewHolder" est une astuce permettant de faire pointer directement une "View" vers des fils préalablement trouvés avec findViewById.

    En cas d'arborescence complexe ou profonde, le findViewById peut être un poil long (genre 1ms hein !), et du coup, on le faisait une fois, on stockait le résultat dans le "ViewHolder" (qu'on collait en "tag" justement), et on n'avait plus à le refaire en cas de recyclage de la view.

    Déjà à l'époque je considérais que pour un layout avec 2 views, le findViewById était suffisamment court pour ne pas avoir recourt à ce "ViewHolder".
    Maintenant, vu l'évolution des téléphones c'est encore plus vrai.

    Toutefois, si vous désirez passer par un "ViewHolder", il suffit de lui rajouter le TextWatcher, et de le modifier à la volée (au lieu de conserver le TextWatcher directement dans le tag, il le sera dans le ViewHolder).

    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
     
    ViewHolder holder = ret.getTag();
    if (holder == null) {
        holder = new ViewHolder();
        holder.textEdit = (TextEdit) ret.findViewById(R.id.my_text_edit);
        ret.setTag(holder);
    } else 
        holder.textEdit.removeTextChangeListener(holder.watcher);
     
    // on setup la value...
    holder.textEdit.setText(....);
     
    // on setup le watcher...
    holder.watcher = new ListTextWatcher(position);
    holder.textEdit.addTextChangeListener(holder.watcher);
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Le viewholder prend du sens sur le fastscroll (setFastScrollEnabled(true)) d'une listview. Si tu as une listview de 1000 éléments (on est d'accord que c'est pas forcément pertinent) que tu fastscroll sans viewholder, le scroll risque de ne pas être très fluide.

    http://developer.android.com/trainin...tml#ViewHolder
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Au vu du code de getTag comparé à findViewById.... je pense surtout que le layout utilisé va indiquer si il est pertinent ou non d'utiliser un view holder.

    Mais c'est vrai que sur un fast-scroll, ça peut devenir utile.
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Bonsoir,

    J'ai un peu du mal a implanter ton code,

    Voici le mien:

    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
    public class Morceau_fils extends BaseAdapter implements TextWatcher { // La j'ai du rajouter les 3 méthodes du TextWatcher (ou la déclarer abstract)
    
        private List<Fils> mListF;
        private Context mContext;
        private LayoutInflater mInflater;
        private int mmode;
    
        private SparseArray<String> editedValues;
    
        public Morceau_fils(Context context, List<Fils> aListF, Integer mode) {
            mContext = context;
            mListF = aListF;
            mInflater = LayoutInflater.from(mContext);
            mmode = mode;
            this.editedValues = new SparseArray<String>();
        }
    
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
    
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) { }
    
        @Override
        public void afterTextChanged(Editable s) { }
    
        public int getCount() {
            return mListF.size();
        }
    
        public Object getItem(int position) {
            return mListF.get(position);
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        public View getView(int position, View convertView, ViewGroup parent){
    
              LinearLayout layoutItem;
    
            if (convertView == null) {
                layoutItem = (LinearLayout) mInflater.inflate(R.layout.activity_morceau_fils, parent, false);
            } else {
                layoutItem = (LinearLayout) convertView;
            }
    
            TextView tv_Nom = (TextView)layoutItem.findViewById(R.id.TV_mFils_Nom);
            final EditText et_Val = (EditText)layoutItem.findViewById(R.id.ET_mFils_Val);
            final Switch sw_Bool = (Switch)layoutItem.findViewById(R.id.switch1);
            Integer type = mListF.get(position).GetType_fils();
            String val = mListF.get(position).GetValeur_fils();
    ...
    
             String edited = this.editedValues.get(position);
            if (edited == null)
               et_Val.setText(val);
            else
                et_Val.setText(edited);
            TextWatcher watcher = (TextWatcher) et_Val.getTag();
            if (watcher != null)
                et_Val.removeTextChangedListener(watcher);
            watcher = new ListTextWatcher(position);
            et_Val.addTextChangedListener(watcher);
            et_Val.setTag(watcher);
    
            return layoutItem;
        }
    
        private class ListTextWatcher implements TextWatcher {
            int position;
    
            public ListTextWatcher(int p) { this.position = p;}
    
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
    
            }
    
            @Override
            public void afterTextChanged(Editable s) {
                Morceau_fils.this.editedValues.put(this.position, s.toString());
            }
        }
    
    }
    C'est au niveau du watcher = new ListTextWatcher(position) que j'ai du mal a comprendre ce qu'il faut faire :/
    Tu pourrais m'aider pliz ?

    Merci

    Edit: Le probleme pour virer le ViewHold, c'est que je me rappelle plus comment était le code avant (J'ai pas trouvé de mode de versionning dans Android Studio)

    Reedit: je viens de trouver la fonction historique dans VCS > Local History J'ai donc viré le ViewHold

    Rereedit: C'est bon, j'ai trouvé ou était le probleme. Je teste ca si mon PC le veut bien
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  10. #10
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Bon, apres quelques tests, ca fait des bizarreries ....
    Ca mélange des lettre, en supprime certaine, bref, un joli bordel
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  11. #11
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Non mais c'est moi... l'adapter n'implémente pas TextWatcher... j'avais pensé à ça au début, mais c'était trop le bazar


    Ensuite plusieurs remarques...
    1. apparemment tu te base bien sur une Liste d'objets, pourquoi ne pas utiliser ArrayAdapter comme parent (plutôt que de devoir réinventer la roue avec les fonctions getItem etc...).
    2. le "_" est interdit en Java dans les noms de classe / méthodes /membres (bon pas vraiment interdit dans le sens ou le compilateur l'autorise, mais les programmeurs Java en général ne l'utilise jamais). Seule exception: les constantes (toutes en majuscule: par exemple MA_SUPER_CONSTANTE).
    3. Les noms de types (classes, interfaces, enum) sont en UpperCamelCase (première lettre des mots majuscule).
    4. Les noms de membres (fonctions, variables etc...) sont en lowerCamelCase (première lettre des mots majuscule, sauf au début): ainsi: Integer type = mListF.get(position).GetType_fils(); est un truc inconcevable.
    5. Perso je suis plus pour le préfixage des variables membres par "this." au lieu de leur coller un préfixe "m" (qui annulerai le #4 au dessus). Mais c'est une question de gout.
    6. Il y a des incohérence de type. Je sais que depuis Java 5, l'auto-unboxing (le passage de Integer à int automatique par le compilateur) est présent, mais je le considère très dangereux. Si tu demandes un Integer en paramètre d'une fonction, cela veut dire que cette fonction peut s'attendre à recevoir "null". Ce n'est clairement pas le cas de "mode" par exemple (qui, au passage, je suppute, mais j'aime bien supputer , doit être à priori un "enum" ).

    D'autre part, tu ne nous dis pas tout... les ellipses dans ton code cache typiquement quelque chose qu'on devrait savoir je pense !
    Connaitre la classe "Fils" serait pas mal aussi...


    Vu que tu as déjà pas mal de views, je suis passé par un ViewHolder cette fois:
    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
     
    public class MorceauFilsAdapter extends ArrayAdapter<Fils> {      // <= en Java on essaye de conserver le "type" principal de l'objet dans le nom, histoire de pas se gourrer !
     
        private int                           mode;  // pas utilisé dans ton code ???
        private SparseArray<String> editedValues;
     
     
        public Morceau_fils(Context context, List<Fils> fils, int mode) {
            super(context,R.layout.activity_morceau_fils,fils);
            this.mode = mode;  
            this.editedValues = new SparseArray<String>();
        }
     
        // TOUTE LES AUTRES FONCTIONS SONT DEJA IMPLEMENTEES PAR ArrayAdapter !
     
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            View ret = super.getView(position,convertView,parent);
     
            ViewHolder holder = (ViewHolder) ret.getTag();
            if (holder == null) {
                holder = new ViewHolder();
                holder.tvNom = (TextView) ret.findViewById(R.id.TV_mFils_Nom);
                holder.etVal = (TextView) ret.findViewById(R.id.ET_mFils_Val);
                holder.swBool= (TextView) ret.findViewById(R.id.switch1);
                ret.setTag(holder);
            } else {
                holder.etVal.removeTextChangedListener(holder.watcher); // il *faut* supprimer l'ancien text-watcher !
            }
     
     
            /// ON REMPLIT MAINTENANT LES VIEWS AVEC LES DONNEES ...
            Fils fils = getItem(position);
            Integer type = fils .GetType_fils();  // <=    getType() ?  Il y a donc des fils qui n'ont pas de type !
            ...
            // on en fait quoi de ce trucs ?
            ...
     
           String val = this.editedValues.get(position);
           if (val == null)
               val = fils .GetValeur_fils();   // <=   getValeur() ?
           holder.etVal.setText(val);
     
           // il faut aussi remplir holder.tvNom et holder.swBool !   D'ailleurs... à ce sujet... comment est géré le switch ? parcequ'on a la même problématique de sauvegarde que le EditText si celle ci est différée ?
     
     
           // ON SETUP LES LISTENERS QUI DOIVENT ETRE MODIFIES SELON LA POSITION (comme le TextWatcher)
           TextWatcher watcher = new ListTextWatcher(position);
           holder.etVal.addTextChangeListener(watcher);
           holder.watcher = watcher;
     
           return ret;
       }
     
     
       private class ViewHolder
       {
              public  TextView  tvNom;
              public  EditText   etVal;
              public  Switch     swBool;
              public  TextWatcher watcher;
        }
     
        private class ListTextWatcher
        {
              private int position;
              public ListTextWatcher(int p) { this.position = p; }
     
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
     
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
            }
     
            @Override
            public void afterTextChanged(Editable s) {
                MorceauFilsAdapter.this.editedValues.put(this.position, s.toString());
            }
        }
     
    }
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  12. #12
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Avant tout, merci beaucoup pour ton énorme aide
    J'avance pas mal, j'ai mis a jour tout mon code en essayant de respecter les points #2, #3, #4, j'ai bien remplacé les Integer par int, et utilisé l'ArrayAdapter.

    Ca marche plutot pas mal, faudra juste que je regle les switchs, mais ca doit pas etre grand chose.
    Sinon, je mémorise bien les EditText modifiés meme s'il y en a bcp (11 dans mon exemple)

    Par contre, J'utilise un gros bouton central pour Enregistrer toutes les valeurs.
    Jusqu'a présent:
    - je bouclais sur le getCount de ma listView
    - récuperais le listFils.getChildAt(position-1)
    - récuperais le EditText Correspondant,
    et faisais mon UPDATE

    Par contre, vu que j'ai trop d'élements, ca coince:
    Comment pourrais je faire pour récuperer les valeurs du SparseArray<String> a la place de l'EditText ?
    J'ai essayé de le déclarer public, et de l'appeler depuis mon Activité, mais veut rien savoir.
    Ca doit pas etre grand chose je suppose, mais ... voila quoi =)

    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
     private boolean actionSave(){
            boolean result;
            boolean resultglobal = true;
            ListView listFils = (ListView) findViewById(R.id.list_Fils);
            int position = listFils.getAdapter().getCount();
            int idfils;
            String valmodif;
            View v;
            EditText et;
            if (position > 0)
                while (position > 0)
                {
                    //Ici modifier selon le type de donnée
                    v = listFils.getChildAt(position-1);
                    et = (EditText) v.findViewById(R.id.ET_mFils_Val);
                    Fils fils = (Fils) listFils.getAdapter().getItem(position-1);
                    position--;
                    idfils = fils.getIdFils();
                    valmodif = et.getText().toString();
                    result = datasource.UpdateFils(idfils, valmodif, idpere);
                    if ((resultglobal == true) && (result == false))
                        resultglobal = false;
                }
            return resultglobal;
        }
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  13. #13
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Il suffit de déclarer une ou deux fonctions dans l'adapter genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public boolean isModified(int position)
    {
        return this.editedValues.get(position) != null;
    }
     
    public String getModifiedValue(int position)
    {
        return this.editedValues.get(position);
    }
    On n'utilise surtout pas getChild sur une View (en particulier une ListView) vu que les éléments sont partagés, et tout n'est pas affiché....
    Il faut vraiment séparer données et représentation.... les views sont les représentations, les données sont dans l'adapter directement.

    Pour l'adapter le plus simple est de le stocker dans l'activité:
    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
     
    private MorceauFilsAdapter   listAdapter;
     
    ...
     
    // quand on popule la liste:
    this.listAdapter = new MorceauFilsAdapter(this, fils);
    listView.setAdapter(this.listAdapter);
    ....
     
    // quand on sauve le resultat:
    for (int i = 0; (i < listFils.size()); ++i) {
        if (this.listAdapter.isModified(i)) {
            Fils original = listFils.get(i);
            String newValue = this.listAdapter.getModifiedValue(i);
             ...
        }
    }

    Petit ajout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ((resultglobal == true) && (result == false))
                        resultglobal = false;
    C'est du simple calcul boolean hein !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resultglobal = (resultglobal && result);

    Je ne sais d'ailleurs pas trop ce que représente resultglobal ni à quoi il sert (savoir si quelque chose a été modifié ?)
    En général, dans une UI, on fait l'inverse:
    Le bouton "sauvegarder" n'est présent *que si* quelque chose doit être sauvé, donc la fonction devrait toujours renvoyer "true".... donc ne rien renvoyer
    Enfin, voilà quoi, je sais pas trop l'utilité du boolean en retour...
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  14. #14
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2002
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2002
    Messages : 203
    Points : 86
    Points
    86
    Par défaut
    Merci pour la méthode, je pense que je vais pouvoir me débrouiller pour la suite, enfin, on verra .

    Merci encore en tout cas pour tes conseils

    Pour le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ((resultglobal == true) && (result == false))
                        resultglobal = false;
    En fait, ca me permet de voir si au moins une ligne n'est pas mise a jour, je renvois un echec de la mise a jour (donc FALSE)
    dbsanté: Ma première application Android consacré au suivi médical totalement déconnecté.
    Score Assistant: Dans un tout autre registre, une application pour compter les points de plus de 80 jeux !
    N'hésitez pas a les télécharger !!

  15. #15
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Si c'est pour signifier une erreur, une Exception est largement plus adaptée qu'un boolean qui n'indiquera aucune raison de l'échec de la mise à jour.

    Enfin, c'est mon avis
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

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

Discussions similaires

  1. Problème de Scroll sur Une TStringGrid en mode saisie
    Par Delphi-ne dans le forum Delphi
    Réponses: 5
    Dernier message: 23/10/2006, 09h50
  2. Afficher les données d'un champ sur une ligne
    Par white-angel dans le forum Access
    Réponses: 6
    Dernier message: 30/08/2006, 11h09
  3. Scrolling sur une ListBox
    Par dede92 dans le forum Windows
    Réponses: 2
    Dernier message: 02/06/2006, 18h56
  4. enregistrer les données d'un FORMULAIRE sur une TABLE
    Par godzinho dans le forum Access
    Réponses: 15
    Dernier message: 11/03/2006, 18h03

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