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 :

SQLite / Cursor / ListView / Adapter


Sujet :

Composants graphiques Android

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut SQLite / Cursor / ListView / Adapter
    Bonjour,

    Je tente depuis plusieurs jours à créer une application dans laquelle je puisse afficher une Listview dans laquelle est affichée des nom/prénom/poste/email/tel de personnes. Et ensuite pouvoir cliquer sur un des item pour voir la fiche détaillée de cette personne.
    J'ai réussi à créer la bdd et la table. Mais je bloque sur l'affichage de la vue (ListView) notamment avec la partie adapter/cursor que je n'ai pas compris.

    Si quelqu'un pouvait m'aider, je lui en serais très reconnaissant.

    Voici mes différentes Activity:

    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
    public class MaBaseSQLite extends SQLiteOpenHelper {
     
    	private static final String TABLE_EMPLOYES = "table_employes";
     
    	private static final String COL_ID = "ID";
    	private static final String COL_NOM = "Nom";
    	private static final String COL_PRENOM = "Prenom";
    	private static final String COL_ROLE = "Role";
    	private static final String COL_POSTE = "Poste";
    	private static final String COL_TELEPHONE = "Telephone";
    	private static final String COL_EMAIL = "Email";
     
    	private static final String REQUETE_CREATION_BD = "CREATE TABLE " + TABLE_EMPLOYES + " ("
    	+ COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_NOM + " TEXT NOT NULL, "
    	+ COL_PRENOM + " TEXT, " + COL_ROLE + " TEXT NOT NULL, " + COL_POSTE + " TEXT NOT NULL, " + COL_TELEPHONE + " TEXT, "
    	+ COL_EMAIL + " TEXT);";
     
    	public MaBaseSQLite(Context context, String name, CursorFactory cursorfactory, int version) {
    		super(context, name, cursorfactory, version);
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db) {
    		//on créé la table à partir de la requête écrite dans la variable CREATE_BDD
    		db.execSQL(REQUETE_CREATION_BD);
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		db.execSQL("DROP TABLE" + TABLE_EMPLOYES + ";");
    		onCreate(db);
    	}	
    }
    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
    public class Employe {
    	//création du constructeur ainsi que des getter et des setter
     
    	private int id;
    	private String nom;
    	private String prenom;
    	private String telephone;
    	private String poste;
    	private String role;
    	private String email;
     
    	public Employe(){}
     
    	public Employe(String nom, String prenom, String telephone, String poste, String role, String email){
    		this.nom = nom;
    		this.prenom = prenom;
    		this.telephone = telephone;
    		this.poste = poste;
    		this.role = role;
    		this.email = email;
    	}
     
     
    	//id
    	public int getId() {
    		return id;
    	}
     
    	public void setId(int id) {
    		this.id = id;
    	}
     
     
    	//nom
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
     
    	//prenom
    	public String getPrenom() {
    		return prenom;
    	}
     
    	public void setPrenom(String prenom) {
    		this.prenom = prenom;
    	}	
     
    	//telephone
    	public String getTelephone() {
    		return telephone;
    	}
     
    	public void setTelephone(String telephone) {
    		this.telephone = telephone;
    	}	
     
    	//poste
    	public String getPoste() {
    		return poste;
    	}
     
    	public void setPoste(String poste) {
    		this.poste = poste;
    	}
     
    	//role
    	public String getRole() {
    		return role;
    	}
     
    	public void setRole(String role) {
    		this.role = role;
    	}	
     
    	//email
    	public String getEmail() {
    		return email;
    	}
     
    	public void setEmail(String email) {
    		this.email = email;
    	}
     
     
    	public String toString(){
    		return "ID : "+id+"\nNOM : "+nom+"\nPRENOM : "+prenom+"\nTELEPHONE : "+telephone+"\nPOSTE : "
    				+poste+"\nROLE : "+role+"\nEMAIL : "+email;
    	}
    }
    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
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    public class EmployesBDD {
     
    		//permet de gérer l’insertion, la suppression, la modification des employes dans la BDD et de faire des requêtes pour récupérer un employé contenu dans la BDD
     
    	/*
    	 * création d'une couche d'abstraction afin de proposer des méthodes d'accès et de manipulation simplifiées à la bbd
    	 * et d'apporter une indépendance vis-à-vis de la source de données. Si, par ex, on souhaite changer de type de source, 
    	 * et travailler avec des services internet ou des fichiers, alors il ne faudra changer que le code de cette 
    	 * classe d'abstraction
    	 */
     
    		private static final int VERSION_BDD = 1;
    		private static final String NOM_BDD = "ditimi.db";
     
    		private static final String TABLE_EMPLOYES = "table_employes";
     
    		private static final String COL_ID = "ID";
    		private static final int NUM_COL_ID = 0;
    		private static final String COL_NOM = "Nom";
    		private static final int NUM_COL_NOM = 1;
    		private static final String COL_PRENOM = "Prenom";
    		private static final int NUM_COL_PRENOM = 2;
    		private static final String COL_ROLE = "Role";
    		private static final int NUM_COL_ROLE = 3;
    		private static final String COL_POSTE = "Poste";
    		private static final int NUM_COL_POSTE = 4;
    		private static final String COL_TELEPHONE = "Telephone";
    		private static final int NUM_COL_TELEPHONE = 5;
    		private static final String COL_EMAIL = "Email";
    		private static final int NUM_COL_EMAIL = 6;
     
     
    		//l'instance de la bdd qui sera manipulée au travers de cette classe
    		private SQLiteDatabase bdd;
     
    		private MaBaseSQLite maBaseSQLite;
     
    		public EmployesBDD(Context context){
    			//On créer la BDD et sa table
    			maBaseSQLite = new MaBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
    		}
     
     
    		//on ouvre la BDD en écriture
    		public SQLiteDatabase open(){
    			bdd = maBaseSQLite.getWritableDatabase();
    			return bdd;
    		}
     
    		//on ferme l'accès à la BDD
    		public void close(){
    			bdd.close();
    		}
     
     
    		public SQLiteDatabase getBDD(){
    			return bdd;
    		}
     
    		//récupère un employé en fonction de son nom
    		public Employe getEmploye(String nom) {
    			Cursor c = bdd.query(TABLE_EMPLOYES, new String[]{
    					COL_ID, COL_NOM, COL_PRENOM, COL_POSTE, COL_ROLE, COL_EMAIL, COL_TELEPHONE},
    					null, null, null, COL_NOM + " LIKE " + nom, null);
    			return cursorToEmploye(c);
    		}
     
    		//récupère un employé en fonction de son id
    		public Employe getEmploye(int id) {
    			Cursor c = bdd.query(TABLE_EMPLOYES, new String[]{
    					COL_ID, COL_NOM, COL_PRENOM, COL_POSTE, COL_ROLE, COL_EMAIL, COL_TELEPHONE},
    					null, null, null, COL_ID + " LIKE " + id, null);
    			return cursorToEmploye(c);
    		}
     
    		//supprime un employé à partir de son id (normalement boolean au lieu de int ?)
    		public int removeEmployeWithID(int id){
    			//Suppression d'un employé de la BDD grâce à l'ID
    			return bdd.delete(TABLE_EMPLOYES, COL_ID + " = " +id, null);
    		}
     
    		//la méthode cursorToEmployes permet de transformer le curseur de résultat en objet métier
    		private Employe cursorToEmploye (Cursor c) {
    			//si la requête ne renvoie pas de résultat
    			if (c.getCount() == 0)
    				return null;
     
    			Employe retEmploye = new Employe();
    			//extraction des valeurs depuis le curseur
    			retEmploye.setId(c.getInt(NUM_COL_ID));
    			retEmploye.setNom(c.getString(NUM_COL_NOM));
    			retEmploye.setPrenom(c.getString(NUM_COL_PRENOM));
    			retEmploye.setRole(c.getString(NUM_COL_ROLE));
    			retEmploye.setPoste(c.getString(NUM_COL_POSTE));
    			retEmploye.setTelephone(c.getString(NUM_COL_TELEPHONE));
    			retEmploye.setEmail(c.getString(NUM_COL_EMAIL));
    			//ferme le curseur pour libérer les ressources
    			c.close();
    			return retEmploye;
    		}
     
    		//retourne tous les employés de la bdd
    		public ArrayList<Employe> getAllEmploye(){
    			Cursor c = bdd.query(TABLE_EMPLOYES, new String[]{
    					COL_ID, COL_NOM, COL_PRENOM, COL_POSTE, COL_ROLE, COL_EMAIL, COL_TELEPHONE},
    					null, null, null, null, null);
    			return cursorToEmployes(c);
    		}
     
     
    		private ArrayList<Employe> cursorToEmployes(Cursor c) {
    			//si la requête ne renvoie pas de résultat
    			if (c.getCount() == 0)
    				return new ArrayList<Employe>(0);
     
    			ArrayList<Employe> retEmployes = new ArrayList<Employe>(c.getCount());
    			c.moveToFirst();
    			do {
    				Employe employe = new Employe();
    				employe.setId(c.getInt(NUM_COL_ID));
    				employe.setNom(c.getString(NUM_COL_NOM));
    				employe.setPrenom(c.getString(NUM_COL_PRENOM));
    				employe.setRole(c.getString(NUM_COL_ROLE));
    				employe.setPoste(c.getString(NUM_COL_POSTE));
    				employe.setTelephone(c.getString(NUM_COL_TELEPHONE));
    				employe.setEmail(c.getString(NUM_COL_EMAIL));
    				retEmployes.add(employe);
    			} while (c.moveToNext());
    			//ferme le curseur pour libérer les ressources
    			c.close();
    			return retEmployes;
    		}
     
     
    		//insérer un employé dans la table des employés (code en {} à vérifier)
    		public long insertEmploye(Employe employe){
    			//Création d'un ContentValues (fonctionne comme une HashMap)
    			ContentValues values = new ContentValues();
    			//on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
    			values.put(COL_NOM, employe.getNom());
    			values.put(COL_PRENOM, employe.getPrenom());
    			values.put(COL_ROLE, employe.getRole());
    			values.put(COL_POSTE, employe.getPoste());
    			values.put(COL_TELEPHONE, employe.getTelephone());
    			values.put(COL_EMAIL, employe.getEmail());
    			//on insère l'objet dans la BDD via le ContentValues
    			return bdd.insert(TABLE_EMPLOYES, null, values);
    		}
     
     
    		//mettre à jour un employé dans la table des employés (code en {} à vérifier)
    		public int updateEmploye(int id, Employe employeToUpdate){
    			//La mise à jour d'un employé dans la BDD fonctionne plus ou moins comme une insertion
    			//il faut simple préciser quel employé on doit mettre à jour grâce à l'ID
    			ContentValues values = new ContentValues();
    			values.put(COL_NOM, employeToUpdate.getNom());
    			values.put(COL_PRENOM, employeToUpdate.getPrenom());
    			values.put(COL_ROLE, employeToUpdate.getRole());
    			values.put(COL_POSTE, employeToUpdate.getPoste());
    			values.put(COL_TELEPHONE, employeToUpdate.getTelephone());
    			values.put(COL_EMAIL, employeToUpdate.getEmail());
    			return bdd.update(TABLE_EMPLOYES, values, COL_ID + " = " +id, null);
    		}
     
     
    		//je ne sais pas si je dois laisser cette dernière partie dans cette activity
     
    		private class MaBaseSQLIte extends SQLiteOpenHelper {
     
    			public MaBaseSQLIte(Context context, String name,
    					CursorFactory cursorfactory, int version) {
    				super(context, name, cursorfactory, version);
    				// TODO Auto-generated constructor stub
    			}
     
    			@Override
    			public void onCreate(SQLiteDatabase db) {
    				// TODO Auto-generated method stub
     
    			}
     
    			@Override
    			public void onUpgrade(SQLiteDatabase db, int oldVersion,
    					int newVersion) {
    				// TODO Auto-generated method stub
     
    			}
     
     
    		}
     
    	}
    et ma classe d'affichage dans laquelle j'ai testé de grands nombres de possiblité d'adpater/cursor

    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
    public class DicSqlActivity extends ListActivity {
     
    	private EmployesBDD employeBdd;
    	private static final String TABLE_EMPLOYES = "table_employes";
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            //Création d'une instance de ma classe EmployesBDD
            employeBdd = new EmployesBDD(this);
     
            //On ouvre la base de données pour écrire dedans
            employeBdd.open();      
     
    	}
     
       /*     
    //j'amagine que je dois mettre mon cursor ici, voici une des bêtises que j'ai écrit
            
        public ArrayList<Employe> getAllEmploye(){
        	return getAllEmploye();
        }
    */
     
     
        @Override
        protected void onDestroy()
        {
            if (employeBdd != null)
            {
            	employeBdd.close();
            }
            super.onDestroy();
        }
    }
    Je ne comprends pas comment afficher les résultats dans cette activity
    J'ai tenté pleins de choses pour finalement revenir en arrière pour comprendre ce que je fais et réussir à afficher ma listview. Sans résultat.

    Je suis un peu perdu. J'espère que l'un d'entre vous pourra m'aider. J'espère que la méthode de travail choisi (séparation en plusieurs class) est utile et judicieuse.

    Merci.

  2. #2
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    Il te manque un "adapter" pour injecter les données (ici, issues d'une bdd) dans ta listview, qui manque aussi. Tout ce que tu as codé pour l'instant c'est uniquement l'aspect "données" avec :
    - un helper SQLite
    - un POJO (Employee)
    - un DAO
    - Une activité qui ouvre puis ferme la bdd. Pas très utile donc.
    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

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    merci pour tes remarques et tes explications.

    Voici un des adapters que j'ai tenté mais rien ne s'affiche à part mon fond blanc. Je n'ai pas d'erreur dans le LogCat.

    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
      public class DicSqlActivity extends ListActivity {
     
    	private EmployesBDD employeBdd;
    	private static final String TABLE_EMPLOYES = "table_employes";
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            //Création d'une instance de ma classe EmployesBDD
            employeBdd = new EmployesBDD(this);
     
            //On ouvre la base de données pour écrire dedans
            employeBdd.open();      
     
    	}
     
        	public ArrayList<Employe> getAllEmploye(){
        		ArrayList<Employe> employes = employeBdd.getAllEmploye();
     
     
                Cursor c = (Cursor) employeBdd.getAllEmploye();
                startManagingCursor(c);
                //pour mettre un autre élément, rajouter un textview dans list ?
                SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.list, c, new String[]{"nom"+"prenom"},new int[]{R.id.tv01});
     
     
                //this.setListAdapter(adapter);
                getListView().setAdapter(adapter);
    			return employes;
        }
     
     
        @Override
        protected void onDestroy()
        {
            if (employeBdd != null)
            {
            	employeBdd.close();
            }
            super.onDestroy();
        }
    }
    J'ai également un fichier main.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
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
     
    	<ListView android:id="@android:id/list" android:background="@android:color/white"
    		android:layout_width="fill_parent" android:layout_height="fill_parent"></ListView>
     
    	    <TextView
            android:id="@+id/tv01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
     
    </LinearLayout>

  4. #4
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Après moultes recherches, je pense comprendre que je dois créer un modèle d'adapteur personnalisé. Voilà ce que j'ai fait :

    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
    public class MyCustomAdapter extends BaseAdapter {
     
    public int getCount() {
    return 0;
    }
     
    public Object getItem(int arg0) {
    return null;
    }
     
    public long getItemId(int position) {
    return 0;
    }
     
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    	// TODO Auto-generated method stub
    	return null;
    }
    }
    Mais je reste toujours au même point. Je ne comprends pas comment afficher ma ListView dans mon activity principale ... malgré tout ce code

    Je me complique la vie ? Je ne vois pas une chose toute simple ?

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    J'ai choisis de me concentrer sur mon activity principale. J'ai crée une méthode DataBind et voici le 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 class DicSqlActivity extends ListActivity {		
     
    	EmployesBDD employeBdd;
     
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            getListView().setAdapter((ListAdapter) this);
     
            //Création d'une instance de ma classe EmployesBDD
            employeBdd = new EmployesBDD(this);
     
            //On ouvre la base de données pour écrire dedans
            employeBdd.open();    		
     
            //méthode pour placer tous les employés dans la listview
            DataBind();
    	}	
     
        public void DataBind(){
        	Cursor c = (Cursor) employeBdd.getAllEmploye();
        	startManagingCursor(c);
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        			this,
        			R.layout.list,
        			c, 
        			new String[]{"Nom", "Prenom", "Role","Telephone","Email"},
        			new int[]{R.id.textNom, R.id.textPrenom, R.id.textRole, R.id.textTelephone,R.id.textEmail});
        	setListAdapter(adapter);
     
        }
    Malheureusement j'ai une erreur sur cette ligne que je n'arrive pas à résoudre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cursor c = employeBdd.getAllEmploye();
    J'ai une croix rouge et si je place ma souris dessus j'ai comme message
    Type mismatch: cannot convert from ArrayList<Employe> to Cursor
    L'un d'entre vous voit-il mon erreur ?

  6. #6
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    L'erreur parle d'elle-même, non ? :s

    Tu essayes de mettre une valeur de ArrayList dans une variable déclarée en Cursor. Vu que les 2 classes n'ont aucun rapport, il te sort cette erreur.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 23
    Points : 20
    Points
    20
    Par défaut hello
    comme dit Hizin , dans ta class EmployesBDD tu a donc getAllEmploye() qui est déclarée en arraylist, tu ne devrais pas ! du doit la déclarer en :
    public cursor getAllEmploye()
    et faire un return c
    et la tu ne devrais plus avoir d'erreur (pour ca )

  8. #8
    Expert confirmé
    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
    Points : 4 166
    Points
    4 166
    Par défaut
    Soit ta méthode getAllEmploye() renvoie une ArrayList et dans ce cas il faut utiliser un ArrayAdapter. Soit elle renvoie un Cursor et dans ce cas il faut utiliser un CursorAdapter. Logique non ?
    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

  9. #9
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Merci beaucoup à tous les trois pour votre aide. Effectivement vos explications sont claires et logiques. Faut que je pratique un peu plus pour comprendre moi

    Je viens de modifier ma méthode DataBind

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public void DataBind(){
        	Cursor c = employeBdd.getAllEmploye();
     
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        			this,
        			R.layout.main,
        			c, 
        			new String[]{"Nom","Prenom","Role"},
        			new int[]{R.id.textNom, R.id.textPrenom,R.id.textRole});
        	getListView().setAdapter(adapter);
        	//setListAdapter(adapter);
        	//this.setListAdapter(adapter);
        }
    Du coup je n'ai plus d'erreurs dans le LogCat et youhou ça fonctionne \o/

    Merci beaucoup.
    Je ne mets pas encore résolu car j'ai envie de continuer un peu en ajoutant une méthode qui me permette lors d'un clic sur un des items d'ouvrir une autre vue avec les infos complètes de l'employé (sauf si un modérateur souhaite que mette résolu et que j'ouvre un autre topic ...).

  10. #10
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Je suis en train d'essayer d'afficher un Toast lors d'un clic sur un item
    J'ai ajouter ce code dans mon acitivity principale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
            //on met un écouteur d'évènement sur notre listView
        	  public void onItemClick(AdapterView<?> parent, View v, int position, int id) {
     
        		    Employe employeFromBdd = employeBdd.getEmployeFromId(id); 
     
        		    if (employeFromBdd != null){
        		      Toast.makeText(DicSqlActivity.this, employeFromBdd.toString(), Toast.LENGTH_LONG).show();
        		    };
     
        }
    Mais le Toast ne s'affiche pas. Voyez-vous pourquoi ?
    Est-ce à cause de ma méthode qui est dans mon activité EmployesBDD ?

    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
    		//récupère un employé en fonction de son id
    		public Employe getEmployeFromId(int id) {
    			Cursor c = bdd.query(TABLE_EMPLOYES, new String[]{
    					COL_ID, COL_NOM, COL_PRENOM, COL_POSTE, COL_ROLE, COL_EMAIL, COL_TELEPHONE},
    					null, null, null, COL_ID + " LIKE " + id, null);
    			return cursorToEmploye(c);
    		}
     
    		//la méthode cursorToEmployes permet de transformer le curseur de résultat en objet métier
    		private Employe cursorToEmploye (Cursor c) {
    			//si la requête ne renvoie pas de résultat
    			if (c.getCount() == 0)
    				return null;
     
    			Employe retEmploye = new Employe();
    			//extraction des valeurs depuis le curseur
    			retEmploye.setId(c.getInt(NUM_COL_ID));
    			retEmploye.setNom(c.getString(NUM_COL_NOM));
    			retEmploye.setPrenom(c.getString(NUM_COL_PRENOM));
    			retEmploye.setRole(c.getString(NUM_COL_ROLE));
    			retEmploye.setPoste(c.getString(NUM_COL_POSTE));
    			retEmploye.setTelephone(c.getString(NUM_COL_TELEPHONE));
    			retEmploye.setEmail(c.getString(NUM_COL_EMAIL));
    			//ferme le curseur pour libérer les ressources
    			c.close();
    			return retEmploye;
    		}
    Autre question : mon activity affiche pour le moment une ListView avec Nom et Prénom de la personne, quelle est la manipulation à faire pour afficher une autre activity avec toutes les infos de l'employé lors d'un clic sur un item ?

  11. #11
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Là, je te conseil de mettre un breakpoint sur le if à l'aide de l'IDE que tu utilises et de lancer en mode débogage. Tu devrais au moins déterminer si tu passes dans le if.

    Ps : tu as un ; ne servant à rien là : if (...) {};
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  12. #12
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Merci encore Hizin pour ton aide.
    Je ne sais pas encore faire de breakpoint mais je me renseigne.
    J'ai effacé mon ";" en trop (merci encore).

    Tu m'as fait remarqué aussi que je n'ai pas mis d'écouteur d'événements.
    Voici ce que j'ai fait :

    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
        public void DataBind(){
        	Cursor c = employeBdd.getAllEmploye();
        	startManagingCursor(c);
     
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        			this,
        			R.layout.list,
        			c, 
        			new String[]{"Nom","Prenom","Role"},
        			new int[]{R.id.textNom, R.id.textPrenom,R.id.textRole});
        	getListView().setAdapter(adapter);
            //getListView().setTextFilterEnabled(true);
     
        	ListView lv = getListView();
            lv.setTextFilterEnabled(true);	
            lv.setOnItemClickListener(new OnItemClickListener() {
            	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        		
        		    Employe employeFromBdd = employeBdd.getEmployeFromId(id); 
     
     
            		Toast.makeText(DicSqlActivity.this, employeFromBdd.toString(), Toast.LENGTH_LONG).show(); 
     
        }
            });
        }
    Et là j'obtiens une erreur dans le LogCat sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Employe employeFromBdd = employeBdd.getEmployeFromId(id);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    04-05 21:11:44.739: E/AndroidRuntime(565): 	at fr.rl.dicsql.DicSqlActivity$1.onItemClick(DicSqlActivity.java:93)
    Mon problème viendrait du fait que je ne récupère pas l'id de la bdd ?

  13. #13
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    J'ai fait un test avec GetAllEmployes voir si j'arrivais à récupérer l'id de la bdd dans la listview et ça marche

    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
        public void DataBind(){
        	Cursor c = employeBdd.getAllEmploye();
        	startManagingCursor(c);
     
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        			this,
        			R.layout.list,
        			c, 
        			new String[]{"_id", "Nom","Prenom","Role"},
        			new int[]{R.id.textId, R.id.textNom, R.id.textPrenom,R.id.textRole});
        	getListView().setAdapter(adapter);
            //getListView().setTextFilterEnabled(true);
     
        	final ListView lv = getListView();
            lv.setTextFilterEnabled(true);	
            lv.setOnItemClickListener(new OnItemClickListener() {
            	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {        		
        		    Employe employeFromBdd = employeBdd.getEmploye(id); 
     
    				//HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position);	        		
            		Toast.makeText(DicSqlActivity.this, employeFromBdd.toString(), Toast.LENGTH_LONG).show(); 
     
        }
            });
        }
    L'id s'affiche dans la ListView mais il y a une ligne d'erreur (la 1ère ) dans le LogCat que je n'avais pas vu qui s'affiche lorsque je clique sur un item
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    04-05 21:54:30.358: E/AndroidRuntime(836): java.lang.IllegalArgumentException: HAVING clauses are only permitted when using a groupBy clause
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.database.sqlite.SQLiteQueryBuilder.buildQueryString(SQLiteQueryBuilder.java:184)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1226)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at fr.rl.dicsql.EmployesBDD.getEmploye(EmployesBDD.java:100)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at fr.rl.dicsql.DicSqlActivity$1.onItemClick(DicSqlActivity.java:93)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.widget.AdapterView.performItemClick(AdapterView.java:284)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.widget.ListView.performItemClick(ListView.java:3382)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.os.Handler.handleCallback(Handler.java:587)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    04-05 21:54:30.358: E/AndroidRuntime(836): 	at android.os.Looper.loop(Looper.java:123)
    La première ligne d'erreur m'interpelle.
    Voyez-vous d'où vient mon erreur ?

    ma class EmployeBDD
    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
     
    		//récupère un employé en fonction de son id
    		public Employe getEmploye(long id) {
    			Cursor c = bdd.query(TABLE_EMPLOYES, new String[]{
    					COL_ID, COL_NOM, COL_PRENOM, COL_POSTE, COL_ROLE, COL_EMAIL, COL_TELEPHONE},
    					null, null, null, COL_ID + " LIKE " + id, null);
    			return cursorToEmploye(c);
    		}
     
    		//la méthode cursorToEmployes permet de transformer le curseur de résultat en objet métier
    		private Employe cursorToEmploye (Cursor c) {
    			//si la requête ne renvoie pas de résultat
    			if (c.getCount() == 0)
    				return null;
     
    			Employe retEmploye = new Employe();
    			//extraction des valeurs depuis le curseur
    			retEmploye.setId(c.getInt(NUM_COL_ID));
    			retEmploye.setNom(c.getString(NUM_COL_NOM));
    			retEmploye.setPrenom(c.getString(NUM_COL_PRENOM));
    			retEmploye.setRole(c.getString(NUM_COL_ROLE));
    			retEmploye.setPoste(c.getString(NUM_COL_POSTE));
    			retEmploye.setTelephone(c.getString(NUM_COL_TELEPHONE));
    			retEmploye.setEmail(c.getString(NUM_COL_EMAIL));
    			//ferme le curseur pour libérer les ressources
    			c.close();
    			return retEmploye;
    		}

  14. #14
    Expert éminent

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

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

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Juste une inversion de paramètres....
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  15. #15
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Merci de ton aide nicroman.
    Si je comprends bien c'est cette partie qui pose soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		//récupère un employé en fonction de son id
    		public Employe getEmploye(long id) {
    			Cursor c = bdd.query(TABLE_EMPLOYES, new String[]{
    					COL_ID, COL_NOM, COL_PRENOM, COL_POSTE, COL_ROLE, COL_EMAIL, COL_TELEPHONE},
    					null, null, null, COL_ID + " LIKE " + id, null);
    			return cursorToEmploye(c);
    		}
    Mais je la regarde et je ne vois pas d'erreur. J'ai modifié "LIKE" par "=", sans résultat.
    Que dois-je modifier ?

    L'autre ligne où j'ai une erreur est dans mon activity principale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        		    Employe employeFromBdd = employeBdd.getEmploye(id);
    qui vient de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        	final ListView lv = getListView();
            lv.setTextFilterEnabled(true);	
            lv.setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        		    Employe employeFromBdd = employeBdd.getEmploye(id); 
                    Toast.makeText(DicSqlActivity.this, employeFromBdd.toString(), Toast.LENGTH_SHORT).show();

  16. #16
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Je n'arrive pas à réussir à afficher un Toast affichant l'id lors d'un clic sur un item

    Je n'abandonne pas mais au lieu de m'arracher tous mes cheveux, j'ai tenté l'étape suivante : lors d'un clic sur un item (sur lequel est affiché l'id, le nom et le prénom d'un employé) je souhaite ouvrir une autre activity avec la fiche complète de l'employé.

    Voici ce que j'ai fait :
    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
    public class DicSqlActivity extends ListActivity {		
     
    	EmployesBDD employeBdd;
    	protected ListAdapter adapter;
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);    
     
            //Création d'une instance de ma classe EmployesBDD
            employeBdd = new EmployesBDD(this);
            employeBdd.open();    		
     
            //méthode pour placer tous les employés dans la listview
            DataBind();
     
        }
     
            public void DataBind(){
        	Cursor c = employeBdd.getAllEmploye();
        	startManagingCursor(c);
     
        	SimpleCursorAdapter adapter = new SimpleCursorAdapter(
        			this,
        			R.layout.list,
        			c, 
        			new String[]{"_id", "Nom","Prenom"},
        			new int[]{R.id.textId, R.id.textNom, R.id.textPrenom});
        	getListView().setAdapter(adapter);
     
        }
     
    	public void onListItemClick(ListView p, View v, int position, long id) {
    	  Intent intent = new Intent(this, EmployeDetails.class);
    	  Cursor c = (Cursor) adapt.getItem(position);
    	  intent.putExtra("Employe_ID", c.getInt(c.getColumnIndex("_id")));
    	  startActivity(intent);
     
        }
    et l'activity employeDetails
    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
    public class EmployeDetails extends Activity {
     
        protected TextView employeNom;
        protected TextView employePrenom;
        protected TextView employeRole;
        protected TextView employePoste;
        protected TextView employeEmail;
        protected TextView employeTelephone;
        protected int employeId;
     
    	//l'instance de la bdd qui sera manipulée au travers de cette classe
    	private SQLiteDatabase bdd;
     
    	private MaBaseSQLite maBaseSQLite;
     
    	//on ouvre la BDD en écriture
    	public SQLiteDatabase open(){
    		bdd = maBaseSQLite.getWritableDatabase();
    		return bdd;
    	}
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.employe_details);
     
     
            employeId = getIntent().getIntExtra("EMPLOYE_ID", 0);
            Cursor cursor = bdd.rawQuery("SELECT * FROM TABLE_EMPLOYES WHERE COL_ID = ?", 
                                    new String[]{""+employeId});
     
            if (cursor.getCount() == 1)
            {
                    cursor.moveToFirst();
     
                    employeNom = (TextView) findViewById(R.id.employeNom);
                    employeNom.setText(cursor.getString(cursor.getColumnIndex("Nom")));
     
                    employePrenom = (TextView) findViewById(R.id.employePrenom);
                    employePrenom.setText(cursor.getString(cursor.getColumnIndex("prenom")));
     
                    employeTelephone = (TextView) findViewById(R.id.employeTelephone);
                    employeTelephone.setText(cursor.getString(cursor.getColumnIndex("officePhone")));
     
                    employePoste = (TextView) findViewById(R.id.employePoste);
                    employePoste.setText(cursor.getString(cursor.getColumnIndex("poste")));
     
                    employeEmail = (TextView) findViewById(R.id.employeEmail);
                    employeEmail.setText(cursor.getString(cursor.getColumnIndex("email")));
     
            }
     
        }
     
    }
    mon soucis vient de l'activity principale. Lorsque je clique sur un des items, mon app se ferme et j'ai cette erreur dans mon LogCat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    04-06 22:48:02.811: E/AndroidRuntime(1338): 	at fr.rl.dicsql.DicSqlActivity.onListItemClick(DicSqlActivity.java:85)
    la ligne 85 est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cursor c = (Cursor) adapter.getItem(position);
    Pouvez-vous m'aider à voir d'où vient mon erreur ?

    Ps: je me suis aidé de ce tuto coenraets.org

  17. #17
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Cursor c = (Cursor) adapt.getItem(position);Ta variable s'appelle "adapter" dans tout ton code, et ici "adapt".
    D'ailleurs, il doit manquer un bout de code, car je ne vois absolument pas comment il peut compiler, vu que la variable "adapt" n'est pas déclarée.

    Pourrais-tu, s'il te plaît, mettre ton erreur au complet ? Au minimum, l'erreur en elle-même et le "caused by ..." en pointant la ligne en question.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  18. #18
    Membre habitué
    Inscrit en
    Novembre 2010
    Messages
    154
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 154
    Points : 130
    Points
    130
    Par défaut
    Merci encore Hizin pour ton aide.
    Désolé pour l'erreur adapt/adapter j'avais fait quelques tests pour voir si mon soucis venait de là.

    Voici mon code propre avec mon erreur:

    Mon activity principale:
    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
    public class DicSqlActivity extends ListActivity {
     
    	EmployesBDD employeBdd;
    	// protected Cursor c;
    	protected ListAdapter adapter;
     
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
     
    		// Création d'une instance de ma classe EmployesBDD
    		employeBdd = new EmployesBDD(this);
     
    		// On ouvre la base de données pour écrire dedans
    		employeBdd.open();
     
    		// méthode pour placer tous les employés dans la listview
    		DataBind();
    	}
     
    	public void DataBind() {
    		Cursor c = employeBdd.getAllEmploye();
    		// startManagingCursor(c);
     
    		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
    				R.layout.list, c, new String[] { "_id", "Nom", "Prenom"},
    				new int[] {R.id.textId, R.id.textNom, R.id.textPrenom});
    		getListView().setAdapter(adapter);
    		// this.setListAdapter(adapter);
     
    	}
     
    	/*
    	 * //Enfin on met un écouteur d'évènement sur notre listView
    	 * getListView().setOnListItemClickListener(new OnItemClickListener() {
    	 * public void onItemClick(AdapterView<?> parent, View view, int position,
    	 * long id) {
    	 * 
    	 * Employe employeFromBdd = employeBdd.getEmploye(id);
    	 * 
    	 * //HashMap<String, String> o = (HashMap<String, String>)
    	 * lv.getItemAtPosition(position); Toast.makeText(DicSqlActivity.this,
    	 * employeFromBdd.toString(), Toast.LENGTH_LONG).show();
    	 * 
    	 * } }); }
    	 */
     
     
    	// public void onListItemClick(AdapterView<?> p, View v, int position, long id) {
    	public void onListItemClick(ListView p, View v, int position, long id) {
    		Intent intent = new Intent(this, EmployeDetails.class);
    		Cursor c = (Cursor) adapter.getItem(position);
    		intent.putExtra("EMPLOYE_ID", c.getInt(c.getColumnIndex("_id")));
    		startActivity(intent);
    	}
     
    	protected void onDestroy() {
    		if (employeBdd != null) {
    			employeBdd.close();
    		}
    		super.onDestroy();
    	}
     
    }
    Mon activity EmployeDetails
    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
    public class EmployeDetails extends Activity {
     
        protected TextView employeNom;
        protected TextView employePrenom;
        protected TextView employeRole;
        protected TextView employePoste;
        protected TextView employeEmail;
        protected TextView employeTelephone;
        protected int employeId;
     
    	//l'instance de la bdd qui sera manipulée au travers de cette classe
    	private SQLiteDatabase bdd;
    	private MaBaseSQLite maBaseSQLite;
     
    	//on ouvre la BDD en écriture
    	public SQLiteDatabase open(){
    		bdd = maBaseSQLite.getWritableDatabase();
    		return bdd;
    	}
     
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.employe_details);
     
     
            employeId = getIntent().getIntExtra("EMPLOYE_ID", 0);
            Cursor cursor = bdd.rawQuery("SELECT * FROM TABLE_EMPLOYES WHERE COL_ID = ?", 
                                    new String[]{""+employeId});
     
            if (cursor.getCount() == 1)
            {
                    cursor.moveToFirst();
     
                    employeNom = (TextView) findViewById(R.id.employeNom);
                    employeNom.setText(cursor.getString(cursor.getColumnIndex("Nom")));
     
                    employePrenom = (TextView) findViewById(R.id.employePrenom);
                    employePrenom.setText(cursor.getString(cursor.getColumnIndex("Prenom")));
     
                    employeTelephone = (TextView) findViewById(R.id.employeTelephone);
                    employeTelephone.setText(cursor.getString(cursor.getColumnIndex("Telephone")));
     
                    employePoste = (TextView) findViewById(R.id.employePoste);
                    employePoste.setText(cursor.getString(cursor.getColumnIndex("Poste")));
     
                    employeEmail = (TextView) findViewById(R.id.employeEmail);
                    employeEmail.setText(cursor.getString(cursor.getColumnIndex("Email")));
     
            }
     
        }
     
    }
    Ma ListView avec l'id/nom/prénom des employés s'affiche bien et lorsque je clique sur un item, l'app se ferme et j'ai mon LogCat qui voit rouge

    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
    04-07 21:04:47.751: D/AndroidRuntime(301): Shutting down VM
    04-07 21:04:47.751: W/dalvikvm(301): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
    04-07 21:04:47.769: E/AndroidRuntime(301): FATAL EXCEPTION: main
    04-07 21:04:47.769: E/AndroidRuntime(301): java.lang.NullPointerException
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at fr.rl.dicsql.DicSqlActivity.onListItemClick(DicSqlActivity.java:73)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.app.ListActivity$2.onItemClick(ListActivity.java:321)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.widget.AdapterView.performItemClick(AdapterView.java:284)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.widget.ListView.performItemClick(ListView.java:3382)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.widget.AbsListView$PerformClick.run(AbsListView.java:1696)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.os.Handler.handleCallback(Handler.java:587)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.os.Handler.dispatchMessage(Handler.java:92)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.os.Looper.loop(Looper.java:123)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at java.lang.reflect.Method.invokeNative(Native Method)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at java.lang.reflect.Method.invoke(Method.java:521)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    04-07 21:04:47.769: E/AndroidRuntime(301): 	at dalvik.system.NativeStart.main(Native Method)
    La ligne 73:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cursor c = (Cursor) adapter.getItem(position);
    Merci pour votre aide.

  19. #19
    Modérateur
    Avatar de Hizin
    Homme Profil pro
    Développeur mobile
    Inscrit en
    Février 2010
    Messages
    2 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Février 2010
    Messages : 2 180
    Points : 5 072
    Points
    5 072
    Par défaut
    Les NPE ne peuvent être causées que par :
    • invocation de méthode sur un objet non-créé
    • passage d'une valeur NULL en paramètre à une méthode ne l'autorisant pas


    Vérifie donc si ta variable "adapter" est bien initialisée à une valeur différente de null, et/ou si la variable "position" n'est pas à null.
    C'est Android, PAS Androïd, ou Androïde didiou !
    Le premier est un OS, le second est la mauvaise orthographe du troisième, un mot français désignant un robot à forme humaine.

    Membre du comité contre la phrase "ça marche PAS" en titre et/ou explication de problème.

    N'oubliez pas de consulter les FAQ Android et les cours et tutoriels Android

  20. #20
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 605
    Points : 18 523
    Points
    18 523
    Par défaut
    Si t'as créé un Adapter à partir d'un Cursor, et que tu veux récupérer le Cursor à partir de l'adapter, c'est plus un truc du genre :
    C'est pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adapter.getItem(position);
    Keith Flint 1969 - 2019

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. listview + adapter
    Par lartisan dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 12/04/2014, 09h19
  2. SQLite cursor select android
    Par PetitGregory dans le forum Android
    Réponses: 2
    Dernier message: 03/07/2013, 15h40
  3. ListView adapter passage de variable
    Par freaks dans le forum Composants graphiques
    Réponses: 9
    Dernier message: 08/11/2012, 11h35
  4. Réponses: 4
    Dernier message: 14/02/2011, 12h25
  5. Réponses: 6
    Dernier message: 09/04/2009, 11h55

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