TP7 Affichage des noms dans la listView

Modérateurs : Douin, F. Lemoine, Farinone

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

TP7 Affichage des noms dans la listView

Message par Delot » 01 avr. 2017 11:28

Bonjour,

Je n'arrive pas à afficher les noms, prénoms et courriels dans ma listView. Mon application se lance correctement et me créer le bon nombre de lignes à chaque fois mais elles sont vides.
Je pense que le problème vient de mon MainActivity.java :

Code : Tout sélectionner

AsyncTaskFindAll findAll = new AsyncTaskFindAll();
findAll.execute(pDAO);
List<Permanence> result = findAll.get();
PermanenceAdapter arrayAdapter = new PermanenceAdapter(MainActivity.this, android.R.id.list, result);
setListAdapter(arrayAdapter);
Si quelqu'un à une idée.
Merci

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: TP7 Affichage des noms dans la listView

Message par khris » 01 avr. 2017 13:59

Hello,
Pourrais-tu coller le code de ton adapter et celui des layouts (celui de ton item textView, ainsi que celui de la main activity) avec les noms des fichiers ?

Sinon à la louche je dirais que le problème vient de l'instanciation de ton PermanenceAdapter.
Parmi les paramètres, tu as inclus android.R.id.list en guise d'id de ressources, ce qui correspond à une ressource propre à Android et non au fichier xml représentant le layout contenant ta/tes textView.
A la place, essaie plutôt d'inclure R.layout.nom_de_ton_layout_xml.

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP7 Affichage des noms dans la listView

Message par Delot » 01 avr. 2017 14:41

Salut et merci pour ta réponse,

Voici le code de mon adapter (PermanenceAdapter.java) :

Code : Tout sélectionner

package smb116.cnam.tp7;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

public class PermanenceAdapter extends ArrayAdapter<Permanence> {

    private List<Permanence> objets;
    public PermanenceAdapter(Context context, int textViewRessourceId, List<Permanence> objects) {
        super(context, textViewRessourceId, objects);
        this.objets = objects;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if(v==null) {
            LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(android.R.layout.simple_list_item_1, null);
        }
        Permanence p = objets.get(position);
        if(p != null) {
            TextView tid = (TextView)v.findViewById(R.id.id);
            TextView tn = (TextView)v.findViewById(R.id.nom);
            TextView tp = (TextView)v.findViewById(R.id.prenom);
            TextView tc = (TextView)v.findViewById(R.id.courriel);
            if(tid != null) {
                tid.setText(p.getId());
            }
            if(tn != null) {
                tn.setText(p.getNom());
            }
            if(tp != null) {
                tp.setText(p.getPrenom());
            }
            if(tc != null) {
                tc.setText(p.getCourriel());
            }
        }
        return v;
    }
}
et celui de mon layout (activity_main.xml) :

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TableRow android:id="@+id/tableRowId"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true">
        <TextView
            android:id="@+id/id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="TextView" />
        <TextView
            android:id="@+id/nom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="TextView" />
        <TextView
            android:id="@+id/prenom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="TextView" />
        <TextView
            android:id="@+id/courriel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="TextView" />
    </TableRow>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:stackFromBottom="true"
        android:transcriptMode="alwaysScroll"
        android:layout_above="@id/tableRowId" />
</RelativeLayout>
J'ai modifié l'instanciation de mon PermanenceAdapter :

Code : Tout sélectionner

PermanenceAdapter arrayAdapter = new PermanenceAdapter(MainActivity.this, R.layout.activity_main, result);
Mais ça ne fonctionne toujours pas.

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: TP7 Affichage des noms dans la listView

Message par khris » 01 avr. 2017 14:51

As-tu créé un fichier pour le layout d'un item de ta listView ?
C'est ce fichier qu'il faut passer en paramètre :)

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP7 Affichage des noms dans la listView

Message par Delot » 01 avr. 2017 14:57

Non, j'ai tout mis dans le layout activity_main.xml
Je vais en créer un autre pour mes textViews, et je garde activity_main pour ma listView ?

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: TP7 Affichage des noms dans la listView

Message par khris » 01 avr. 2017 15:51

Hummm ok.
Dans ton adapter tu définis des TextView de la façon suivante.

Code : Tout sélectionner

if(p != null) {
    TextView tid = (TextView)v.findViewById(R.id.id);
    TextView tn = (TextView)v.findViewById(R.id.nom);
    TextView tp = (TextView)v.findViewById(R.id.prenom);
    TextView tc = (TextView)v.findViewById(R.id.courriel);
    if(tid != null) {
        tid.setText(p.getId());
    }
    if(tn != null) {
        tn.setText(p.getNom());
    }
    if(tp != null) {
        tp.setText(p.getPrenom());
    }
    if(tc != null) {
        tc.setText(p.getCourriel());
   }
}
Si j'ai bien compris, ces TextView sont placées dans ton activity_main.xml c'est ça ?

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP7 Affichage des noms dans la listView

Message par Delot » 01 avr. 2017 16:01

J'ai modifié un peut le code mais sans plus de résultat.
J'ai les textViews dans le fichier "layout detail_layout.xml" :

Code : Tout sélectionner

<?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">
<TextView
    android:id="@+id/id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:text="TextView" />
<TextView
    android:id="@+id/nom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:text="TextView" />
<TextView
    android:id="@+id/prenom"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:text="TextView" />
<TextView
    android:id="@+id/courriel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="20dp"
    android:text="TextView" />
</LinearLayout>
Et je garde ma listView dans mon "activity_main.xml" :

Code : Tout sélectionner

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_alignParentTop="true"
        android:stackFromBottom="true"
        android:transcriptMode="alwaysScroll" />
</RelativeLayout>
Du coup j'ai modifier mon "MainActivity.java" :

Code : Tout sélectionner

PermanenceAdapter arrayAdapter = new PermanenceAdapter(MainActivity.this, R.layout.detail_layout, result);
A l'affichage, j'ai toujours ma listView avec plein de lignes, mais elles sont toutes vide

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: TP7 Affichage des noms dans la listView

Message par khris » 01 avr. 2017 17:37

As-tu modifié la méthode getView de ton adapter de sort à passer ton nouveau layout dans ton inflater ?

Code : Tout sélectionner

v = inflater.inflate(R.layout.detail_layout.xml, null);
Au lieu de

Code : Tout sélectionner

v = inflater.inflate(android.R.layout.simple_list_item_1, null);

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP7 Affichage des noms dans la listView

Message par Delot » 01 avr. 2017 21:06

J'ai essayé mais maintenant j'ai l'exception :

FATAL EXCEPTION: main
Process: smb116.cnam.tp7, PID: 4878
android.content.res.Resources$NotFoundException: String resource ID #0x0

Douin
Messages : 200
Inscription : 18 mars 2009 15:46

Re: TP7 Affichage des noms dans la listView

Message par Douin » 02 avr. 2017 8:48

Bonjour, n'oubliez pas l'appel de notifyDataSetchanged .. bon dimanche

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: TP7 Affichage des noms dans la listView

Message par khris » 02 avr. 2017 11:30

Bon c'est déjà mieux :)
As-tu des indications sur le fichier et la ligne où se produit cette erreur ?

LudovicF
Messages : 29
Inscription : 20 févr. 2017 15:45

Re: TP7 Affichage des noms dans la listView

Message par LudovicF » 02 avr. 2017 12:54

Bonjour,

dans le même souci d'affichage de la listView, j'ai l'erreur suivante:

Code : Tout sélectionner

FATAL EXCEPTION: main
Process: cnam.smb116.tp7persistanceetpartage, PID: 2583
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
et avec le debuger c'est une erreur de requet SQL au niveau du findAll.get()

Code : Tout sélectionner

no such column: courriel (code 1): , while compiling: SELECT _id, nom, prenom, courriel FROM permanences
code du PermanenceDAO.findAll:

Code : Tout sélectionner

    public List<Permanence> findAll() throws Exception{
        List<Permanence> permanences = new ArrayList<Permanence>();

        Cursor cursor = db.query(TABLE_PERMANENCES, ALL, null, null, null, null, null);
        cursor.moveToFirst();
        while (!cursor.isAfterLast()){
            String nom = cursor.getString(cursor.getColumnIndex(NOM_COLONNE_NOM));
            String prenom = cursor.getString(cursor.getColumnIndex(NOM_COLONNE_PRENOM));
            String courriel = cursor.getString(cursor.getColumnIndex(NOM_COLONNE_COURRIEL));
            Permanence a = new Permanence(nom,prenom,courriel);
            permanences.add(a);
            cursor.moveToNext();
        }
        cursor.close();
        return permanences;
    }
code du main "MainListActivity":

Code : Tout sélectionner

package cnam.smb116.tp7persistanceetpartage;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import java.sql.SQLException;
import java.util.List;

public class MainListActivity extends ListActivity {
    private PermanenceDAO pDAO;
    private List<Permanence> result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.liste);
        pDAO = new PermanenceDAO(this);
        try {
            pDAO.open();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        Permanence p1 = new Permanence("Douin", "Jean-Michel", "jean-michel.douin@cnam.fr");
        Permanence p2 = new Permanence("Farinone", "Jean-Marc", "jean-marc.farinone@cnam.fr");
        Permanence p3 = new Permanence("Lemoine", "Frédéric", "frederic.lemoine@cnam.fr");

        try{
            pDAO.create(p1);
            pDAO.create(p2);
            pDAO.create(p3);
        }catch (Exception e){
            e.printStackTrace();
        }

        AsyncTaskFindall findAll = new AsyncTaskFindall();
        findAll.execute(pDAO);
        try {
            result = findAll.get();
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    private class AsyncTaskFindall extends AsyncTask<PermanenceDAO, Void, List<Permanence>>{
        private Throwable cause = null;

        @Override
        protected List<Permanence> doInBackground(PermanenceDAO... db) {
            try {
                return db[0].findAll();
            }catch (Exception e) {
                cause = e;
                return null;
            }
        }

        @Override
        protected void onPostExecute(List<Permanence> permanences) {
            super.onPostExecute(permanences);
            try {
                PermanenceAdapter arrayAdapter = new PermanenceAdapter(
                        MainListActivity.this, R.layout.items_layout, result);
                setListAdapter(arrayAdapter);
            }catch (Exception e){
                e.printStackTrace();
            }
            finally {
                pDAO.close();
            }
        }
    }
}

khris
Messages : 28
Inscription : 25 mars 2014 18:10
Contact :

Re: TP7 Affichage des noms dans la listView

Message par khris » 02 avr. 2017 13:03

D'après le message d'erreur, il ne reconnait pas la colonne "courriel".
Comment l'as-tu appelée lors de la création de ta base ?

Delot
Messages : 21
Inscription : 27 févr. 2017 15:50

Re: TP7 Affichage des noms dans la listView

Message par Delot » 02 avr. 2017 19:27

J'ai trouvé, c'était un problème de conversion de mon id de int en String.
Merci à tous ;)

LudovicF
Messages : 29
Inscription : 20 févr. 2017 15:45

Re: TP7 Affichage des noms dans la listView

Message par LudovicF » 03 avr. 2017 13:52

Pour ma part, a certain endroit, j'ai écrit courriel avec 2 "r" et 1 "r" :-/

Faut-il que je supprime la base en ligne de commande ?

Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité