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 :

ListView, (HashMap) Programme plante, sans erreur visible


Sujet :

Composants graphiques Android

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Par défaut ListView, (HashMap) Programme plante, sans erreur visible
    Bonjour, je cherche à faire une ListView pour un projet de fin de formation. Cette list doit afficher des parcours de randonné. Avec dedans, le nom du parcours, le temps moyen, la durée, et la distance du parcours.

    Mais voila, je pensé utiliser la fonctionnalité HashMap pour ça, et voulant d’abord m'exercer, j'ai fait une activité affichant juste un nom et un prénom. mais l'application plante directement, le debug ne m'en dit pas plus, et le code ne semble pas afficher d'erreur. Voici le code ainsi que les layouts :

    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
     
    import android.app.Activity;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
     
    import java.util.ArrayList;
    import java.util.HashMap;
     
    public class MainActivity extends Activity {
     
        private SimpleAdapter mSchedule;
     
        public MainActivity(){
            ListView list_parcours = (ListView) findViewById(R.id.listView);
            ArrayList<HashMap<String, String>> list = new ArrayList<>();
            HashMap<String, String> map = new HashMap<>();
     
            map.put("nom","Martin");
            map.put("prenom","Julien");
            list.add(map);
     
            mSchedule  = new SimpleAdapter(this, list, R.layout.list_row,
                    new String[] {"nom", "prenom"}, new int[] {R.id.nom, R.id.prenom});
            list_parcours.setAdapter(mSchedule);
        }
    }
    le content_main :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="theo.com.listbd.MainActivity"
        tools:showIn="@layout/activity_main">
     
     
        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listView"
            android:layout_alignParentTop="true"
            android:layout_alignParentStart="true" />
    </RelativeLayout>
    le layout de la list :

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
     
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="Large Text"
            android:id="@+id/nom" />
     
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Medium Text"
            android:id="@+id/prenom" />
    </LinearLayout>
    Je suis nouveau sur le site, si j'ai mal expliqué mon problème, n’hésitez pas à me le faire savoir ^^

  2. #2
    Expert confirmé

    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
    Billets dans le blog
    3
    Par défaut
    Il manque juste un truc: la partie du "LogCat" ou est affichée l'exception qui fait planter le programme (si le programme plante il y a obligatoirement une trace dans le logcat).


    Bon... maintenant, il y a je pense un truc que tu n'as pas suivi dans les applications Android: Tu n'es jamais responsable de l'instanciation des activités, c'est le système qui s'en occupe tout seul, avec le constructeur par défaut (sans paramètre).
    La raison est simple:
    Le système va créer une instance de ton activité (le constructeur de MainActivity est donc appelée).
    Le système va ensuite créer un tas de trucs pour cette activité (loading du theme, attachement au contexte de l'application, ouverture d'une fenêtre, ...).
    Pour finir, le système va appeler la fonction "onCreate(Bundle)" de l'activité... C'est à cet endroit, et uniquement là, que tu vas pouvoir intervenir efficacement.

    La tu fais le code dans le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListView list_parcours = (ListView) findViewById(R.id.listView);
    Que crois tu que va faire "findViewById" ?
    La fonction va regarder la fenêtre attachée à l'activité (déjà il n'y en a pas encore, on vient de créer l'objet), demander à cette de parcourir la liste des views attachées (ce qui n'est possible qu'après que ton code ait appelé setContentView(R.layout.content_main) ce qu'il ne fait jamais), afin de trouver la view "R.id.listView" (le résultat sera donc obligatoirement "null").

    Le reste devrait fonctionner jusqu'à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mSchedule  = new SimpleAdapter(this, list, R.layout.list_row,
                    new String[] {"nom", "prenom"}, new int[] {R.id.nom, R.id.prenom});
    Ou tu crée un adapter en lui passant comme contexte l'activité... C'est effectivement la bonne manière de faire, sauf qu'on est dans le constructeur, et le contexte n'est donc pas encore initialisé...

    Donc voilà, en gros, bouge le code dans onCreate()
    N'oublie pas d'appeler le parent (super.onCreate()) puis setContentView (qui va instancier les objets correspondant à ton layout) avant de demander à récupérer une référence sur la ListView en question.



    Pour terminer: pour le layout de list-item: android:layout_height="match_parent" dans le linearlayout est une erreur, il faut laisser à "wrap_content" (sinon l'item pourrait prendre toute la place disponible).


    Et rapidement, fuis comme la peste les HashMap<String,String>(); et les SimpleAdapter.
    C'est certes simple à mettre en oeuvre, mais cela va à l'encontre même des principes d'un langage fortement typé comme Java.

    D'autant qu'un "temps moyen", c'est une durée, donc à priori un "long" (en ms). Et n'a de représentation textuelle (String) qu'à l'affichage (quand on connait le contexte, et donc la manière de formater ce truc pour l'utilisateur).
    Idem pour la distance... "Yards" ? "Km" ? Tout va dépendre du système.
    Il faut donc conserver au maximum les données "brutes" telles qu'elles existent vraiment (on peut soi-même choisir l'unité, mais le type en découle fortement et c'est rarement String), et ne les convertir en String pour affichage dans un TextView qu'au tout dernier moment.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 2
    Par défaut
    Merci beaucoup, je n'avais pas compris l’intérêt de onCreate. Et merci pour les conseils.

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

Discussions similaires

  1. Programme qui plante sans crier gare
    Par camboui dans le forum C++
    Réponses: 14
    Dernier message: 16/08/2010, 11h03
  2. Programme planté > msg erreur
    Par sokai dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 04/11/2009, 16h11
  3. Réponses: 2
    Dernier message: 27/04/2009, 13h09
  4. Programme détectant les erreurs de mémoire
    Par gids01 dans le forum MFC
    Réponses: 2
    Dernier message: 07/12/2005, 10h57
  5. REquete sans erreur sql qui n'agit pas ........
    Par Skam dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/02/2005, 13h41

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