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 :

Problème d'affichage de donnée d'une ArrayList dans une ListView


Sujet :

Composants graphiques Android

  1. #61
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    Et sinon dans le cadre des TextvVew j'ai commencé à mettre ça dans mon Activity mai ça ressemble à ce que j'ai mis dans mon CustomAdapter :http://prntscr.com/dv43ym

    "tu n'as
    "peut être, pas le droit de programmer des widgets"
    Pour ça je n'ai pas vraiment compris enfaite.
    Pourquoi je n'aurai pas le droit ?

  2. #62
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    Si je ne me trompe pas pour le setAdapter, pour une ListView ça ne me renvoie pas d'erreur, tandis pour pour le TextView si..

  3. #63
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Parce que les éléments graphiques, TextView, ListView, etc... ne peuvent être accédés que depuis le thread principal, le UI Thread en anglais(UI=User Interface)
    Tu peux le vérifier rapidement:
    Au début de onCreate, tu donnes un nom au thread principal
    Thread.currentThread().setName("UI Thread");

    et dans la méthode de callback onSuccess, tu fais:
    Log.d("TEST", "Nom du thread: "+Thread.currentThread().getName());

    Si ça renvoi "UI Thread" c'est bon, tu peux garder ton code.

    Cordialement.

    EDIT: remplacé Thread.getCurrentThread par Thread.currentThread()

  4. #64
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Autre chose, dans ton Adapter, il y a un truc qui me chagrine!

    La méthode getView() est la uniquement pour fabriquer une View, basée sur sa description xml(son Layout).
    Et c'est la méthode bindView() qui affecte les données à une View, que lui passe le systéme.

    Toi, tu fais tout dans getView() !!

    Cordialement,

    EDIT: je suis dans l'erreur!! ArrayAdapter n'a pas de méthode bindView()!

  5. #65
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    si je fais ça: http://prntscr.com/dv4dzf
    ça me renvoie une erreur.
    Il faut peut être le déclarer dans le Manifest non ?

  6. #66
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Revoi mon message corrigé, je me suis planté dans la syntaxe de Thread.currentThread(). désolé!!

    NB: dans le Manifest, on ne déclare que les Activity, les Services, les BroadcastReceiver et les ContentProvider.

  7. #67
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    "La méthode getView() est la uniquement pour fabriquer une View, basée sur sa description xml(son Layout)."

    D'accord, donc je devrais utiliser getView() uniquement pour crée une vue ?
    Mais ce n'est pas déjà ce que je fais ?

    "Et c'est la méthode bindView() qui affecte les données à une View, que lui passe le systéme."
    D'accord, c'est ce que j'ai fais dans le getView() si je ne me trompe pas là ?..


    "NB: dans le Manifest, on ne déclare que les Activity, les Services, les BroadcastReceiver et les ContentProvider. "

    Oui je voulais dire dans gradle, pour la compilation et resynchroniser mon projet désolé. ^^

  8. #68
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Non, c'est toi qui a raison!
    Je viens de regarder la doc sur ArrayAdapter: il n'a pas de méthode bindView()

  9. #69
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    D'accord, je t'ai envoyé un message aussi en privée.

    Si tu veux, je peux te remontrer ce que j'ai fait.

    Mais d'après toi mon code est bon comme ça.
    Pour moi ça l'est, mon CustomAdapter pour moi est bon, c'est dans l'Activity pour faire pareil avec que des TextView et changer assez facilement entre TextView et ListView.

  10. #70
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    Bon, j'ai actuellement ce problème-ci, pas d'erreur dans mon code mais lors de la compilation.
    Voilà une petite capture d'écran: http://prntscr.com/dv9fp3

    Mon code dans mon MuseeActivity:

    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
     
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.ListView;
    import android.widget.TextView;
     
    import com.google.android.gms.appindexing.Action;
    import com.google.android.gms.appindexing.AppIndex;
    import com.google.android.gms.appindexing.Thing;
    import com.google.android.gms.common.api.GoogleApiClient;
    import com.google.gson.Gson;
    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.AsyncHttpResponseHandler;
    import com.loopj.android.http.RequestHandle;
     
    import cz.msebera.android.httpclient.Header;
     
     
    public class MuseeActivity extends AppCompatActivity {
     
        private static final String BASE_URL = "https://opendata.paris.fr/api/records/1.0/search/?dataset=liste-musees-de-france-a-paris&rows=50&pretty_print=true";
        public String dateInString;
        public String dateFormatString;
        TextView textList;
        ListView listView;
        MuseeJSON responseObj;
        CustomAdapter adapter1;
        Gson gson;
        AsyncHttpClient client;
     
        private MuseeAdapter adapter;
        private CustomAdapter listAdapter;
     
        private GoogleApiClient client2;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.each_list_item);
     
            listView = (ListView) findViewById(R.id.listeMusee1);
     
            this.setListAdapter(adapter1);
     
            //On instancie notre client qui récupère la connexion au client http
            client = new AsyncHttpClient();
            RequestHandle requestHandle = client.get(MuseeActivity.this, BASE_URL, new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    String responsestr = new String(responseBody);
                    gson = new Gson();
                    responseObj = gson.fromJson(responsestr, MuseeJSON.class);
                    adapter1 = new CustomAdapter(MuseeActivity.this, responseObj.getRecords());
                    //textList.setAdapter(adapter1);
                    listView.setAdapter(adapter1);
                    textList.setText((CharSequence) adapter1); //test ici
                }
     
                /**ArrayList<CustomAdapter> objects = new ArrayList<CustomAdapter>();
                CustomAdapter customAdapter = new CustomAdapter(this, objects); //erreur ici
                listView.setAdapter(customAdapter); //setAdapter non reconnu, ça doit être une grosse erreur de débutant
                CustomAdapter.getView();**/
     
                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
     
                }
            });
     
            // ATTENTION: This was auto-generated to implement the App Indexing API.
            // See https://g.co/AppIndexing/AndroidStudio for more information.
            client2 = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
        }
     
        public void setListAdapter(CustomAdapter listAdapter) {
            this.listAdapter = listAdapter;
        }
     
        public Action getIndexApiAction() {
            Thing object = new Thing.Builder()
                    .setName("Musee Page") // TODO: Define a title for the content shown.
                    // TODO: Make sure this auto-generated URL is correct.
                    .setUrl(Uri.parse("http://[ENTER-YOUR-URL-HERE]"))
                    .build();
            return new Action.Builder(Action.TYPE_VIEW)
                    .setObject(object)
                    .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                    .build();
        }
     
        @Override
        public void onStart() {
            super.onStart();
     
            // ATTENTION: This was auto-generated to implement the App Indexing API.
            // See https://g.co/AppIndexing/AndroidStudio for more information.
            client2.connect();
            AppIndex.AppIndexApi.start(client2, getIndexApiAction());
        }
     
        @Override
        public void onStop() {
            super.onStop();
     
            // ATTENTION: This was auto-generated to implement the App Indexing API.
            // See https://g.co/AppIndexing/AndroidStudio for more information.
            AppIndex.AppIndexApi.end(client2, getIndexApiAction());
            client2.disconnect();
        }
     
    }
    Ma class 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
    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
     
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
     
    import java.util.List;
     
    public class CustomAdapter extends BaseAdapter {
     
        private List<MuseeJSON.RecordsBean> mMuseeitem;
        private List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields;
        private List<MuseeJSON.RecordsBean.GeometryBean> mMuseeGeometry;
        private Context mContext;
        private LayoutInflater inflater;
        private int myItemLayout;
     
        public CustomAdapter(Context mContext, List<MuseeJSON.RecordsBean> mMuseeitem) {
            this.inflater = inflater;
            this.mContext = mContext;
        }
     
        public CustomAdapter(List<MuseeJSON.RecordsBean> mMuseeitem, List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields, List<MuseeJSON.RecordsBean.GeometryBean> mMuseeGeometry) {
            this.mMuseeitem = mMuseeitem;
            this.mMuseeFields = mMuseeFields;
            this.mMuseeGeometry = mMuseeGeometry;
        }
     
        @Override
        public int getCount() {
            return mMuseeitem.size();
        }
     
        public int getCountFields() {
            return mMuseeFields.size();
        }
     
        public int getCountGeometry() {
            return mMuseeGeometry.size();
        }
     
        @Override
        public Object getItem(int position) {
            return mMuseeitem.get(position);
        }
     
        //Si on enlève le prefixe du chemin d'accès List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields on a besoin de cette fonction pour récupérer notre position
        /**public Object getItemFields(int position) {
            return mMuseeFields.get(position);
        }*/
     
        @Override
        public long getItemId(int position) {
            return 0;
        }
     
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.each_list_item, parent, false);
            MuseeJSON.RecordsBean mMuseeitem = (MuseeJSON.RecordsBean) getItem(position);
            MuseeJSON.RecordsBean.FieldsBean mMuseeFields = (MuseeJSON.RecordsBean.FieldsBean) getItem(position);
            MuseeJSON.RecordsBean.GeometryBean mMuseeGeometry = (MuseeJSON.RecordsBean.GeometryBean) getItem(position);
     
            TextView tv0 = (TextView)rowView.findViewById(R.id.datasetid);
            tv0.setText(mMuseeitem.getDatasetid());
     
            TextView tv1 = (TextView)rowView.findViewById(R.id.recordid);
            tv1.setText(mMuseeitem.getRecordid());
     
            TextView tv2 = (TextView)rowView.findViewById(R.id.fields);
            tv2.setText((CharSequence) mMuseeitem.getFields());
     
            TextView tv3 = (TextView)rowView.findViewById(R.id.periode_ouverture);
            tv3.setText(mMuseeFields.getPeriode_ouverture());
     
            TextView tv4 = (TextView)rowView.findViewById(R.id.nom_du_musee);
            tv4.setText(mMuseeFields.getNom_du_musee());
     
            TextView tv5 = (TextView)rowView.findViewById(R.id.adresse);
            tv5.setText(mMuseeFields.getAdr());
     
            TextView tv6 = (TextView)rowView.findViewById(R.id.ville);
            tv6.setText(mMuseeFields.getVille());
     
            TextView tv7 = (TextView)rowView.findViewById(R.id.nomreg);
            tv7.setText(mMuseeFields.getNomreg());
     
            TextView tv8 = (TextView)rowView.findViewById(R.id.fermer);
            tv8.setText(mMuseeFields.getFerme());
     
            TextView tv9 = (TextView)rowView.findViewById(R.id.siteweb);
            tv9.setText(mMuseeFields.getSitweb());
     
            TextView tv10 = (TextView)rowView.findViewById(R.id.coordonnees);
            tv10.setText((CharSequence) mMuseeFields.getCoordonnees_());
     
            TextView tv11 = (TextView)rowView.findViewById(R.id.cp);
            tv11.setText(mMuseeFields.getCp());
     
            TextView tv12 = (TextView)rowView.findViewById(R.id.nomdepartement);
            tv12.setText(mMuseeFields.getNomdep());
     
            TextView tv13 = (TextView)rowView.findViewById(R.id.type);
            tv13.setText(mMuseeGeometry.getType());
     
            TextView tv14 = (TextView)rowView.findViewById(R.id.coordinates);
            tv14.setText((CharSequence) mMuseeGeometry.getCoordinates());
     
            TextView tv15 = (TextView)rowView.findViewById(R.id.record_timestamp);
            tv15.setText(mMuseeitem.getRecord_timestamp());
     
            return rowView;
        }
     
    }
    Mon Layout (fichier XML):

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="horizontal"
                  android:paddingTop="2dp"
                  android:paddingBottom="2dp"
                  android:id="@+id/listeMusee">
     
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_marginLeft="10dp"
            android:id="@+id/listeMuseeLinear">
     
            <ListView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/listeMusee1"/>
     
            <TextView
                android:id="@+id/datasetid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/recordid"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/fields"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/periode_ouverture"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/nom_du_musee"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/adresse"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/ville"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/nomreg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/fermer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/siteweb"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/coordonnees"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/cp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/nomdepartement"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/type"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/coordinates"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
            <TextView
                android:id="@+id/record_timestamp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
     
     
        </LinearLayout>
    </LinearLayout>
    Une idée ?

    Cette méthode consiste à utiliser un TextView par champs plutôt qu'une ListView.

  11. #71
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Bonsoir,

    Pour bien montrer comment utiliser une ListView et un ArrayAdapter pour afficher la liste des musées, j'ai mis en ligne cette vidéo:
    https://youtu.be/NyW6HRRK_og
    C'est la suite de la précédente.
    Pour ceux que ça intéresse...
    Cordialement,

  12. #72
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    J'ai vue ta vidéo, mais elle ne m'aide pas, pourquoi j'ai ce message moi, lors de la compilation ?

    E/AndroidRuntime: FATAL EXCEPTION: UI Thread
    Process: com.example.eric.listemuseebfast, PID: 2474
    java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
    at com.loopj.android.http.AsyncHttpResponseHandler.onUserException(AsyncHttpResponseHandler.java:304)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:395)
    at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
    at com.example.eric.listemuseebfast.CustomAdapter.getCount(CustomAdapter.java:38)
    at android.widget.ListView.setAdapter(ListView.java:493)
    at com.example.eric.listemuseebfast.MuseeActivity$1.onSuccess(MuseeActivity.java:166)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:351)
    at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)*
    at android.os.Handler.dispatchMessage(Handler.java:102)*
    at android.os.Looper.loop(Looper.java:154)*
    at android.app.ActivityThread.main(ActivityThread.java:6119)*
    at java.lang.reflect.Method.invoke(Native Method)*
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)*
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)*
    Disconnected from the target VM, address: 'localhost:8623', transport: 'socket'

  13. #73
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    Bon, si quelqu'un voit le problème:

    Class MuseeActivity:

    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
     
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.ListView;
    import android.widget.TextView;
     
    import com.google.gson.Gson;
    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.AsyncHttpResponseHandler;
     
    import cz.msebera.android.httpclient.Header;
     
     
    public class MuseeActivity extends AppCompatActivity {
     
        //private static final String BASE_URL = "https://opendata.paris.fr/api/records/1.0/search/?dataset=liste-musees-de-france-a-paris&rows=50&pretty_print=true";
        String BASE_URL = "https://opendata.paris.fr/api/records/1.0/search/?dataset=liste-musees-de-france-a-paris&rows=50&pretty_print=true";
        public String dateInString;
        public String dateFormatString;
        TextView textList;
        ListView listView;
        MuseeJSON responseObj;
        CustomAdapter adapter1;
        Gson gson;
        AsyncHttpClient client;
     
        private CustomAdapter listAdapter;
     
        //private GoogleApiClient client2;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.each_list_item);
            //On affecte à "listView" l'id de ListView de notre vue XML
            listView = (ListView) findViewById(R.id.listeMusee1);
            //On instancie notre client qui récupère la connexion au client http
            client = new AsyncHttpClient();
            //on récupère l'Activity, l'url (notre API JSON) et on crée une nouvelle requête http
            client.get(MuseeActivity.this, BASE_URL, new AsyncHttpResponseHandler() {
                @Override
                public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                    //On instancie un nouvelle objet "responsestr" de type String
                    String responsestr = new String(responseBody);
                    //On instancie un nouvelle objet "gson" de type "Gson"
                    gson = new Gson();
                    //On affecte à notre variable "responseObj" la valeur que nous retourne gson qui lui récupère l'objet responsesstr de la class MuseeJSON (class qui contient nos paramètres pour nos musées JSON et nos listes d'objets Musee
                    responseObj = gson.fromJson(responsestr,MuseeJSON.class);
                    //on affecte à listeAdapter nos données de musées Parser pour pouvoir les lires
                    listAdapter = new CustomAdapter(MuseeActivity.this, responseObj.getRecords());
                    //on passe dans notre ListView ntre variable listAdapter
                    listView.setAdapter(listAdapter);
                }
     
                @Override
                public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
     
                }
            });
     
        }
     
        /**public Action getIndexApiAction() {
            Thing object = new Thing.Builder()
                    .setName("Musee Page") // TODO: Define a title for the content shown.
                    // TODO: Make sure this auto-generated URL is correct.
                    .setUrl(Uri.parse("https://opendata.paris.fr/api/records/1.0/search/?dataset=liste-musees-de-france-a-paris&rows=50&pretty_print=true"))
                    .build();
            return new Action.Builder(Action.TYPE_VIEW)
                    .setObject(object)
                    .setActionStatus(Action.STATUS_TYPE_COMPLETED)
                    .build();
        }*/
     
    }
    Class CustomActivity:

    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
     
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
     
    import java.util.List;
     
     
    public class CustomAdapter extends BaseAdapter {
     
        private List<MuseeJSON.RecordsBean> mMuseeitem;
        private List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields;
        private List<MuseeJSON.RecordsBean.GeometryBean> mMuseeGeometry;
        private Context mContext;
        private LayoutInflater inflater;
        private int myItemLayout;
     
        public CustomAdapter(Context mContext, List<MuseeJSON.RecordsBean> mMuseeitem) {
            this.inflater = inflater;
            this.mContext = mContext;
        }
     
        public CustomAdapter(List<MuseeJSON.RecordsBean> mMuseeitem, List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields, List<MuseeJSON.RecordsBean.GeometryBean> mMuseeGeometry) {
            this.mMuseeitem = mMuseeitem;
            this.mMuseeFields = mMuseeFields;
            this.mMuseeGeometry = mMuseeGeometry;
        }
     
        @Override
        public int getCount() {
            return mMuseeitem.size();
        }
     
        public int getCountFields() {
            return mMuseeFields.size();
        }
     
        public int getCountGeometry() {
            return mMuseeGeometry.size();
        }
     
        @Override
        public Object getItem(int position) {
            return mMuseeitem.get(position);
        }
     
        //Si on enlève le prefixe du chemin d'accès List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields on a besoin de cette fonction pour récupérer notre position
        /**public Object getItemFields(int position) {
            return mMuseeFields.get(position);
        }*/
     
        @Override
        public long getItemId(int position) {
            return 0;
        }
     
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.each_list_item, parent, false);
     
            MuseeJSON.RecordsBean mMuseeitem = (MuseeJSON.RecordsBean) getItem(position);
            MuseeJSON.RecordsBean.FieldsBean mMuseeFields = (MuseeJSON.RecordsBean.FieldsBean) getItem(position);
            MuseeJSON.RecordsBean.GeometryBean mMuseeGeometry = (MuseeJSON.RecordsBean.GeometryBean) getItem(position);
     
            TextView tv0 = (TextView)rowView.findViewById(R.id.datasetid);
            tv0.setText(mMuseeitem.getDatasetid());
     
            TextView tv1 = (TextView)rowView.findViewById(R.id.recordid);
            tv1.setText(mMuseeitem.getRecordid());
     
            TextView tv2 = (TextView)rowView.findViewById(R.id.fields);
            tv2.setText((CharSequence) mMuseeitem.getFields());
     
            TextView tv3 = (TextView)rowView.findViewById(R.id.periode_ouverture);
            tv3.setText(mMuseeFields.getPeriode_ouverture());
     
            TextView tv4 = (TextView)rowView.findViewById(R.id.nom_du_musee);
            tv4.setText(mMuseeFields.getNom_du_musee());
     
            TextView tv5 = (TextView)rowView.findViewById(R.id.adresse);
            tv5.setText(mMuseeFields.getAdr());
     
            TextView tv6 = (TextView)rowView.findViewById(R.id.ville);
            tv6.setText(mMuseeFields.getVille());
     
            TextView tv7 = (TextView)rowView.findViewById(R.id.nomreg);
            tv7.setText(mMuseeFields.getNomreg());
     
            TextView tv8 = (TextView)rowView.findViewById(R.id.fermer);
            tv8.setText(mMuseeFields.getFerme());
     
            TextView tv9 = (TextView)rowView.findViewById(R.id.siteweb);
            tv9.setText(mMuseeFields.getSitweb());
     
            TextView tv10 = (TextView)rowView.findViewById(R.id.coordonnees);
            tv10.setText((CharSequence) mMuseeFields.getCoordonnees_());
     
            TextView tv11 = (TextView)rowView.findViewById(R.id.cp);
            tv11.setText(mMuseeFields.getCp());
     
            TextView tv12 = (TextView)rowView.findViewById(R.id.nomdepartement);
            tv12.setText(mMuseeFields.getNomdep());
     
            TextView tv13 = (TextView)rowView.findViewById(R.id.type);
            tv13.setText(mMuseeGeometry.getType());
     
            TextView tv14 = (TextView)rowView.findViewById(R.id.coordinates);
            tv14.setText((CharSequence) mMuseeGeometry.getCoordinates());
     
            TextView tv15 = (TextView)rowView.findViewById(R.id.record_timestamp);
            tv15.setText(mMuseeitem.getRecord_timestamp());
     
            return rowView;
        }
     
    }
    Class MuseeJSON (autrefois Musee) automatiquement générer par le GsonFormat:

    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
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;
     
    import java.util.List;
     
    public class CustomAdapter extends BaseAdapter {
     
        private List<MuseeJSON.RecordsBean> mMuseeitem;
        private List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields;
        private List<MuseeJSON.RecordsBean.GeometryBean> mMuseeGeometry;
        private Context mContext;
        private LayoutInflater inflater;
        private int myItemLayout;
     
        public CustomAdapter(Context mContext, List<MuseeJSON.RecordsBean> mMuseeitem) {
            this.inflater = inflater;
            this.mContext = mContext;
        }
     
        public CustomAdapter(List<MuseeJSON.RecordsBean> mMuseeitem, List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields, List<MuseeJSON.RecordsBean.GeometryBean> mMuseeGeometry) {
            this.mMuseeitem = mMuseeitem;
            this.mMuseeFields = mMuseeFields;
            this.mMuseeGeometry = mMuseeGeometry;
        }
     
        @Override
        public int getCount() {
            return mMuseeitem.size();
        }
     
        public int getCountFields() {
            return mMuseeFields.size();
        }
     
        public int getCountGeometry() {
            return mMuseeGeometry.size();
        }
     
        @Override
        public Object getItem(int position) {
            return mMuseeitem.get(position);
        }
     
        //Si on enlève le prefixe du chemin d'accès List<MuseeJSON.RecordsBean.FieldsBean> mMuseeFields on a besoin de cette fonction pour récupérer notre position
        /**public Object getItemFields(int position) {
            return mMuseeFields.get(position);
        }*/
     
        @Override
        public long getItemId(int position) {
            return 0;
        }
     
        public View getView(int position, View convertView, ViewGroup parent) {
            LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View rowView = inflater.inflate(R.layout.each_list_item, parent, false);
     
            //On crée un objet item que l'on cast pour récupérer l'item
            /**MuseeJSON.RecordsBean item = (MuseeJSON.RecordsBean) getItem(position);
            TextView tv0 = (TextView)rowView.findViewById(R.id.datasetid);
            TextView tv1 = (TextView)rowView.findViewById(R.id.recordid);
            TextView tv2 = (TextView)rowView.findViewById(R.id.fields);
            TextView tv3 = (TextView)rowView.findViewById(R.id.periode_ouverture);
            TextView tv4 = (TextView)rowView.findViewById(R.id.nom_du_musee);
            TextView tv5 = (TextView)rowView.findViewById(R.id.adresse);
            TextView tv6 = (TextView)rowView.findViewById(R.id.ville);
            TextView tv7 = (TextView)rowView.findViewById(R.id.nomreg);
            TextView tv8 = (TextView)rowView.findViewById(R.id.fermer);
            TextView tv9 = (TextView)rowView.findViewById(R.id.siteweb);
            TextView tv10 = (TextView)rowView.findViewById(R.id.coordonnees);
            TextView tv11 = (TextView)rowView.findViewById(R.id.cp);
            TextView tv12 = (TextView)rowView.findViewById(R.id.nomdepartement);
            TextView tv13 = (TextView)rowView.findViewById(R.id.type);
            TextView tv14 = (TextView)rowView.findViewById(R.id.coordinates);
            TextView tv15 = (TextView)rowView.findViewById(R.id.record_timestamp);
     
            tv0.setText(item.getDatasetid());
            tv1.setText(item.getRecordid());
            tv2.setText((CharSequence) item.getFields());
            tv3.setText(item.getPeriode_ouverture());
            tv4.setText(item.getNom_du_musee());
            tv5.setText(item.getDatasetid());
            tv6.setText(item.getDatasetid());
            tv7.setText(item.getDatasetid());
            tv8.setText(item.getDatasetid());
            tv9.setText(item.getDatasetid());
            tv10.setText(item.getDatasetid());
            tv11.setText(item.getDatasetid());
            tv12.setText(item.getDatasetid());
            tv13.setText(item.getDatasetid());
            tv14.setText(item.getDatasetid());
            tv15.setText(item.getDatasetid());*/
     
     
     
            MuseeJSON.RecordsBean mMuseeitem = (MuseeJSON.RecordsBean) getItem(position);
            MuseeJSON.RecordsBean.FieldsBean mMuseeFields = (MuseeJSON.RecordsBean.FieldsBean) getItem(position);
            MuseeJSON.RecordsBean.GeometryBean mMuseeGeometry = (MuseeJSON.RecordsBean.GeometryBean) getItem(position);
     
            TextView tv0 = (TextView)rowView.findViewById(R.id.datasetid);
            tv0.setText(mMuseeitem.getDatasetid());
     
            TextView tv1 = (TextView)rowView.findViewById(R.id.recordid);
            tv1.setText(mMuseeitem.getRecordid());
     
            TextView tv2 = (TextView)rowView.findViewById(R.id.fields);
            tv2.setText((CharSequence) mMuseeitem.getFields());
     
            TextView tv3 = (TextView)rowView.findViewById(R.id.periode_ouverture);
            tv3.setText(mMuseeFields.getPeriode_ouverture());
     
            TextView tv4 = (TextView)rowView.findViewById(R.id.nom_du_musee);
            tv4.setText(mMuseeFields.getNom_du_musee());
     
            TextView tv5 = (TextView)rowView.findViewById(R.id.adresse);
            tv5.setText(mMuseeFields.getAdr());
     
            TextView tv6 = (TextView)rowView.findViewById(R.id.ville);
            tv6.setText(mMuseeFields.getVille());
     
            TextView tv7 = (TextView)rowView.findViewById(R.id.nomreg);
            tv7.setText(mMuseeFields.getNomreg());
     
            TextView tv8 = (TextView)rowView.findViewById(R.id.fermer);
            tv8.setText(mMuseeFields.getFerme());
     
            TextView tv9 = (TextView)rowView.findViewById(R.id.siteweb);
            tv9.setText(mMuseeFields.getSitweb());
     
            TextView tv10 = (TextView)rowView.findViewById(R.id.coordonnees);
            tv10.setText((CharSequence) mMuseeFields.getCoordonnees_());
     
            TextView tv11 = (TextView)rowView.findViewById(R.id.cp);
            tv11.setText(mMuseeFields.getCp());
     
            TextView tv12 = (TextView)rowView.findViewById(R.id.nomdepartement);
            tv12.setText(mMuseeFields.getNomdep());
     
            TextView tv13 = (TextView)rowView.findViewById(R.id.type);
            tv13.setText(mMuseeGeometry.getType());
     
            TextView tv14 = (TextView)rowView.findViewById(R.id.coordinates);
            tv14.setText((CharSequence) mMuseeGeometry.getCoordinates());
     
            TextView tv15 = (TextView)rowView.findViewById(R.id.record_timestamp);
            tv15.setText(mMuseeitem.getRecord_timestamp());
     
            return rowView;
        }
     
    }
    Les deux fichiers XML:

    musee_item.xml:

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:paddingTop="2dp"
        android:paddingBottom="2dp">
     
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/listeMusee1" />
     
     
    </RelativeLayout>
    each_list_item.xml:

    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="horizontal"
                  android:paddingTop="2dp"
                  android:paddingBottom="2dp"
                  android:id="@+id/listeMusee">
     
                    <TextView
                        android:id="@+id/datasetid"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
                    <TextView
                        android:id="@+id/recordid"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/fields"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/periode_ouverture"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/nom_du_musee"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/adresse"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/ville"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/nomreg"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/fermer"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/siteweb"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/coordonnees"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/cp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/nomdepartement"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/type"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/coordinates"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
                    <TextView
                        android:id="@+id/record_timestamp"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content" />
     
     
    </RelativeLayout>

    Voici les erreurs que j'ai désormais:

    E/AsyncHttpRH: User-space exception detected!
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
    at com.example.eric.listemuseebfast.MuseeActivity$1.onSuccess(MuseeActivity.java:53)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:351)
    at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    D/AndroidRuntime: Shutting down VM
    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.eric.listemuseebfast, PID: 7979
    java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
    at com.loopj.android.http.AsyncHttpResponseHandler.onUserException(AsyncHttpResponseHandler.java:304)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:395)
    at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
    at com.example.eric.listemuseebfast.MuseeActivity$1.onSuccess(MuseeActivity.java:53)
    at com.loopj.android.http.AsyncHttpResponseHandler.handleMessage(AsyncHttpResponseHandler.java:351)
    at com.loopj.android.http.AsyncHttpResponseHandler$ResponderHandler.handleMessage(AsyncHttpResponseHandler.java:510)*
    at android.os.Handler.dispatchMessage(Handler.java:102)*
    at android.os.Looper.loop(Looper.java:154)*
    at android.app.ActivityThread.main(ActivityThread.java:6119)*
    at java.lang.reflect.Method.invoke(Native Method)*
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)*
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)*
    Disconnected from the target VM, address: 'localhost:8618', transport: 'socket'

    En capture d'écran ça donne ça: http://prntscr.com/dvdhzx

    Voilà, si quelqu'un peut m'aider.
    Je le remercie d'avance, ça pourrait bien me débloquer et m'en apprendre un peu sur ce genre de problème.

  14. #74
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Salut,

    le message d'erreur indique un objet non initialisé(NullPointerException)
    Cet objet c'est ta ListView.
    Et tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listView.setAdapter(listAdapter);
    dans la méthode de Callback onResponse().

    As tu vérifié, comme j'y insiste dans la vidéo, que cette instruction s'exécute dans le thread principal?
    Tant que tu n'as pas fait cette vérification, inutile d'aller plus loin!

    Cordialement,

    EDIT:
    Dans ton message précédent tu as le message

    E/AndroidRuntime: FATAL EXCEPTION: UI Thread

    UI Thread c'est le thread principal. Donc il y a bien un problème à ce niveau, le LogCat te le dit!!

  15. #75
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    J'essaie ton code avec la classe AsyncHttpClient.
    mais j'ai une erreur.
    Ce n'est pas la méthode onSuccess() qui est exécutée, mais onFailure().
    Et je ne vois pas d’où ça vient!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     hostname in certificate didn't match: <opendata.paris.fr> != <*.opendatasoft.com> OR <*.opendatasoft.com> OR <opendatasoft.com>
    EDIT: ça vient de l'url opendata.paris car avec https://www.google.com onSuccess() est bien exécutée!
    J'ai pu également vérifier que onSuccess() s'exécute bien dans le thread principal.

    Mon conseil: utilise plutôt la librairie OkHttp!

  16. #76
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    "Ce n'est pas la méthode onSuccess() qui est exécutée, mais onFailure()."
    Du coup faire un try catch ? ou ça fonctionne déjà pareil ?

    "J'ai pu également vérifier que onSuccess() s'exécute bien dans le thread principal."
    Je n'ai pas compris comment tu peux voir quel Thread est bien exécuter, et quel Thread fonctionne ou non.

    "Mon conseil: utilise plutôt la librairie OkHttp! "
    Ce n'est pas ce que je fais déjà ?

    Certaines de mes réponse peuvent probablement paraître incohérente ou "newbie" mais je ne développe jamais en Android, je m'y met, et je ne connais pas tout les termes sous JAVA Android, j'apprends en même temps.

  17. #77
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    J'ai fais des petits tests, pour voir si l'envoie de mes objets passer bien, plutôt que d'avoir un retour null, donc j'ai copié le code que j'ai mis dans "onSucess" dans "onFailure" voilà ce que ça me fait: http://prntscr.com/dvjwll
    J'ai aussi instancié un nouveau Thread.

    Maintenant, si je laisse juste le nouveau Thread que j'ai instancié dans mon onFailure j'ai ce jolie bug qui exploite toute ma mémoire ^^: http://prntscr.com/dvjy1n
    Le compilateur continue un bon moment comme ça..

  18. #78
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Explique moi pourquoi tu mets du code dans onFailure()?
    Tu n'as pas l'air de savoir ce qu'est un thread(ou fil d'exécution): https://fr.wikipedia.org/wiki/Thread_(informatique)
    La trace, dans ton premier screen shot, à l'air de montrer que le téléchargement se fait bien avec AsyncHttpClient: tu as toujours une erreur?

  19. #79
    Membre à l'essai
    Homme Profil pro
    Développeur Logiciel
    Inscrit en
    Décembre 2015
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 230
    Points : 20
    Points
    20
    Par défaut
    "Explique moi pourquoi tu mets du code dans onFailure()?"
    Pour faire le test, si je n'ai rien dans mon "onFailure()" , j'ai une erreur comme quoi il n'y a rien qui passe, si je met du code dans mon "onFailure()" je n'ai plus d'erreur, apparemment c'est lui qui est lu.
    Enfaite je voulais juste faire afficher un texte, la tâche qui serait exécuter serait mon objet instancié "r" en faisant "r.start("test")" , enfaite pour faire simple, je m'en servais de debbuger.
    Sauf que ça ne fonctionne pas comme ça, je ne peux pas lui faire passer une simple chaîne de caractère.



    La trace, dans ton premier screen shot, à l'air de montrer que le téléchargement se fait bien avec AsyncHttpClient: tu as toujours une erreur?
    Voilà le résultat: http://prntscr.com/dvkovp

    Jusqu'à arriver à cette erreur-ci: http://prntscr.com/dvkpd2

  20. #80
    Membre éprouvé
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Points : 1 166
    Points
    1 166
    Par défaut
    Je comprend rien!!

    1- ne met pas de code dans onFailure()
    2- dans onSuccess(), met toutes les instructions en commentaire, sauf la première (String responsestr = new ...)
    3- ajoute un Log.d("MainActivity", "responsestr "+responsestr )
    4- lance l'appli.
    5- Y-a-t il toujours une erreur? Vois tu la trace dans le LogCat

    Rappel: Log.d() permet d'écrire une ligne de trace dans la console du moniteur. Mais tu dois le savoir! Mais peut être pas?

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/03/2016, 14h14
  2. Problème d'affichage des données de la BD dans une JList
    Par hela_sfar dans le forum Composants
    Réponses: 0
    Dernier message: 15/07/2013, 15h14
  3. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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