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 :

resdessin d'affichage après rotation d'écran


Sujet :

Android

  1. #1
    Membre confirmé Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 160
    Par défaut resdessin d'affichage après rotation d'écran
    Bonjour;
    Je viens vers car je n'arrive pas à trouver de solution à mon problème.
    Je vous explique:
    J'ai un programme de test ou je crée une base de donnée, j'ajoute des données (c'est le but ...) et je les affiche dans une listview.
    Jusque là, ça va j'ai réussi tout seul!
    La ou ça va pas, c'est quand j'ajoute une donnée, j'update ma base, je modifie ma listview, et je la ré-affiche... mais en fait non.
    Ca me vide l'écran, et affiche bien que lorsque je pivote de téléphone!
    J'ai beau avoir tenté d'utiliser "notifyDataSetChanged();" pas moyen de modifier ce comportement étonnant!

    Auriez vous une idée, s'il vous plaît?
    Je ne comprend pas s'il faut réafficher le listview, ou dire qu'il y a de nouvelle données dedans, ou dire de redessiner tout l'écran.

    Merci de votre aide.

    Rémi.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 476
    Par défaut
    Oui, j'ai une idée, montre nous un bout de code pour comprendre le problème, car ce n'est pas normal d'avoir un écran blanc. La fonction d'update est erronée

    Sinon, tu as un semblant de solution ici : http://stackoverflow.com/questions/1...datasetchanged

  3. #3
    Membre Expert
    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
    Par défaut
    C'est probablement lié à une mauvaise gestion du cycle de vie de l'activité, notamment lors de la rotation. Mais il nous faut voir ton code pour cela.
    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

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

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    à mon avis tu dois reéxecuter l'adapter lié à la listview.
    Edit: je viens de lire que tu tournes l'écran => c'est dans le onResume qu'il faut mettre ton code avec l'adapter, pas dans onCreate.

  5. #5
    Membre confirmé Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 160
    Par défaut
    désolé du retard de la réponse.
    J’essaie de comprendre comment fonctionne android, alors je plaide coupable pour le pourtitude du 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
        public void showDialog(Context context) {
    
            final AlertDialog.Builder dialog = new AlertDialog.Builder (this);                                        // mon alertDialog contient deux champs text: Nouveau_Medic et Nouveau_Dose
            final LayoutInflater inflater;
            inflater = LayoutInflater.from (this);
            dialog.setView (inflater.inflate (R.layout.nouveau_medic, null));
            dialog.setTitle ("Nouveau médicament")
                    .setPositiveButton (ok, new DialogInterface.OnClickListener () {
                        @Override
    public void onClick(DialogInterface dialog, int id) {
                            // sign in the user ...
    Medicament medic = new Medicament ();
                            EditText et1 = (EditText) ((AlertDialog) dialog).findViewById (R.id.Nouveau_Medic);
                            EditText et2 = (EditText) ((AlertDialog) dialog).findViewById (R.id.Nouveau_Dose);
                            String s1 = et1.getText ().toString ();                                                    // Je récupère bien le texte "médicament"
                            String s2 = et2.getText ().toString ();                                                    // Je récupère bien le texte "dose"
                            medic.setMedicament (s1); 
                            medic.setDose (s2);
                            medicBdd.insertMedicament (medic);                                                         // La base est effectivement mise à jour
                            Toast.makeText (MainActivity.this, "Medicament enregistré.", Toast.LENGTH_SHORT).show ();  // Un toast pour faire une info
    
                            listItem.clear ();                                                                         // Je vide le listview
                            listItem=medicBdd.getAllMedicaments ();                                                    // je le re-remplie
                            ((BaseAdapter) listViewMedicaments.getAdapter()).notifyDataSetChanged();                   // et la c'est le drame!!! enfin, non, rien ne se passe!
                        }
                    })
                    .setNegativeButton (cancel, new DialogInterface.OnClickListener () {
                        @Override
    public void onClick(DialogInterface dialog, int which) {
                        }
                    })
                    .show ();
        }
    Merci pour vos avis, je vais jeter un oeil sur stackoverflow

  6. #6
    Membre confirmé Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 160
    Par défaut
    après vos commentaires, je suis allez voir stackoverflow, ainsi que le onResume.
    Je n'ai pas de méthode onResume, effectivement.
    Faut il aussi obligatoirement un onPause aussi?

    Merci de votre aide.

  7. #7
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Salut,

    Je ne pense pas que le problème vienne du cycle de vie de l'activity. D'après ce que j'ai compris, quand tu enregistres dans la base de données, la liste des médicaments se vide et après la rotation de l'écran elle se recharge?

    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  8. #8
    Membre confirmé Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 160
    Par défaut
    bonjour,
    Oui, le raisonnement que je fais:
    1/ l'utilisateur entre un nouveau médicament + dose
    2/ je l'insert dans la base de données
    3/ je vide ma liste d'item


    4/ je devrais ré-afficher mon listView, mais celui ci reste désespérément vide, il ne se ré-affiche que lorsque je bascule l'appareil.

    Voila ou j'en suis pour le moment.

  9. #9
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Tu n'as pas besoin de vider puis remplir à nouveau la ListView pour qu'elle prenne en compte le nouveau médicament. A la place, je te propose ceci :

    De préférence, la méthode insertMedicament doit renvoyer un entier, question de vérifier si l'enregistrement a eu lieu (1 ou un nombre supérieur à 1) ou non (0 ou -1). De ce fait, quand tu vas l'appeler pour enregistrement tu feras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Medicament medic = new Medicament ();
    medic.setMedicament (s1); 
    medic.setDose (s2);
    if(medicBdd.insertMedicament(medic)>=1){
    //Enregistrement réussi, ajouter le nouveau médicament dans la liste
    listItem.add(med); 
    //Ensuite rafraîchir l'adaptateur
    adapter.notifyDataSetChanged(); 
    }
    Note :
    - Tu dois préalablement déclarer explicitement l'adaptateur de la ListView (De préférence dans le onCreate() de l'activitivy ensuite tu affectes l'adaptateur à ta ListView.
    - Une remarque, fais les inflate de views dans le onCreate() de l'activity et non pas ailleurs.

    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

  10. #10
    Membre confirmé Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 160
    Par défaut
    Merci @MasterMbg , ça marche (presque)!!!
    J'ai bien un refresh, mais mon dernier élément (j'ai l'entourage visible) est vide. Mais ça avance, je crois avoir compris le principe!

    Merci à tous de votre aide. Je continue

  11. #11
    Modérateur
    Avatar de MasterMbg
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2011
    Messages
    719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 719
    Par défaut
    Citation Envoyé par rsuinux Voir le message
    J'ai bien un refresh, mais mon dernier élément (j'ai l'entourage visible) est vide.
    Pourrais tu être un peu plus clair?


    Christian Djo,
    Plus tu apprends sérieusement, plus tu te rapproches d'un savoir noble. Une chose est certaine, les difficultés ne s'écarteront de ton chemin...

    Tu es nouveau dans le développement Android, la page des COURS est là pour te faciliter la vie
    Tu peux trouver la réponse à ta question dans la FAQ
    Retrouvez mon tutoriel sur la consommation des services web SOAP
    Pense à voter positivement en appuyant sur en bas à droite de la réponse qui t'a donné une piste de solution.

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

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

    Informations forums :
    Inscription : Mars 2012
    Messages : 1 970
    Par défaut
    non tu n'as pas besoin de onPause.

    Mets ton code qui initialise les objets visibles à l'écran dans onResume().
    C'est à dire les setText, adapter...

    Les find des objets visibles tu le fais dans onCreate().

    Car le onResume s'éxécute après le onCreate.

  13. #13
    Membre confirmé Avatar de rsuinux
    Homme Profil pro
    Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Inscrit en
    Août 2007
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Infirmier Formateur pour logiciel de Dossiers de Soins Informatisés
    Secteur : Santé

    Informations forums :
    Inscription : Août 2007
    Messages : 160
    Par défaut
    éh éh !!
    J'ai réussi!
    J'ai réécrit une classe gérant le listview ainsi que l'adapter. Il n'a fallut un peu de temps pour tout refaire, mais ça marche.
    J'apprends en testant. c'est ma méthode (de classe: jeu de mot facile). Alors j'écris -> je teste -> je refais -> si ça marche pas je recommence plus haut.
    Donc ma classe listItem
    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
    package org.suinot.test_sql;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    
    /**
     * Created by remi on 03/10/16.
     */
    public class ListItem {
        public String medicament;
        public String dosage;
    
        public ListItem() {
            this("medicament", "dosage");
        }
    
        // main constructor
    public ListItem(String medicament, String dosage) {
            super();
            this.medicament = medicament;
            this.dosage = dosage;
        }
    
        public String toString() {
            return this.medicament + " : " + this.dosage;
        }
    
        public int size() {
            return 2;
        }
    
        public void clear() {
            this.medicament = null;
            this.dosage = null;
        }
    
        public ArrayList<String> values() {
            ArrayList<String> list = new ArrayList<String>();
    
            list.add(medicament);
            list.add(dosage);
    
            return list;
        }
    
        public boolean isEmpty() {
            if ((this.medicament == null) && (this.dosage == null)) {
                return true;
            } else {
                return false;
            }
        }
    
    
        public Set<String> keySet() {
            Set<String> s = new HashSet<String> ();
    
            s.add("medicament");
            s.add("dosage");
    
            return s;
        }
    
        public Set entrySet() {
            Set<String> s = new HashSet<String>();
    
            s.add(this.medicament);
            s.add(this.dosage);
    
            return s;
        }
        
        public String Demande_donnee(Object key) {
            if (key.equals("medicament")) {
                return this.medicament;
            }
            if (key.equals("dosage")) {
                return this.dosage;
            }
            throw new ClassCastException();
        }
        
        public String Sauvegarde(String key, String value) {
            if (key.equals("medicament")) {
                this.medicament = value;
            }
            if (key.equals("dosage")) {
                this.dosage = value;
            }
            return value;
        }
    
        public String Suppression(Object key) {
            String value = null;
            if (key.equals("medicament")) {
                value = this.medicament;
                this.medicament = null;
            }
            if (key.equals("dosage")) {
                value = this.dosage;
                this.dosage = null;
            }
            return value;
        }
    
        public boolean Contient_la_clef(Object key) {
            if (key.equals("medicament")) {
                return true;
            }
            if (key.equals("dosage")) {
                return true;
            }
            return false;
        }
        public boolean Contient_la_valeur (Object value) {
            if (value.equals(this.medicament)) {
                return true;
            }
            if (value.equals(this.dosage)) {
                return true;
            }
            return false;
        }
    }
    Ma classe CustomAdapter
    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
    package org.suinot.test_sql;
    
    import android.app.Activity;
    import android.app.ListActivity;
    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Created by remi on 03/10/16.
     */
    public class CustomAdapter extends BaseAdapter {
        private LayoutInflater inflater;
    
        private int resource;
        private ArrayList<ListItem> data;
    
        public CustomAdapter(Context context, int resource, ArrayList<ListItem> data) {
            this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            this.resource = resource;
            this.data = data;
        }
    
        @Override
    public int getCount() {
            return this.data.size();
        }
    
        @Override
    public Object getItem(int position) {
            return this.data.get(position);
        }
    
        @Override
    public long getItemId(int position) {
            return position;
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
    
            if (convertView == null) {
                view = this.inflater.inflate(resource, parent, false);
            } else {
                view = convertView;
            }
    
            return this.bindData(view, position);
        }
    
        public View bindData(View view, int position) {
            if (this.data.get(position) == null) {
                return view;
            }
    
            ListItem item = this.data.get(position);
    
            View viewElement = view.findViewById(R.id.Template_Medic);
            TextView tv = (TextView)viewElement;
            tv.setText(item.medicament);
    
            viewElement = view.findViewById(R.id.Template_Dose);
            tv = (TextView)viewElement;
            tv.setText(item.dosage);
    
            return view;
        }
    }
    Et à présent cela fonctionne.
    Merci à tous de m'avoir fourni quelques idées.

    Rémi.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/03/2016, 20h57
  2. Crash application après rotation écran
    Par athomas dans le forum Android
    Réponses: 7
    Dernier message: 19/09/2013, 17h19
  3. [PowerBuilder] Prob. d'affichage après insertion de contrôle
    Par Oakenshield dans le forum Powerbuilder
    Réponses: 1
    Dernier message: 30/01/2006, 14h37
  4. Réponses: 5
    Dernier message: 29/07/2005, 09h00
  5. Pb d'affichage apres une liste déroulante
    Par loic.440 dans le forum ASP
    Réponses: 13
    Dernier message: 19/01/2005, 14h28

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