IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Simple Cursor Adapter


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Par défaut Simple Cursor Adapter
    Bonjour,

    j’essaie d'afficher des informations par le biais d'une listview et de Simple Cursor Adapter, mais mon écran n'affiche rien et je n'ai pas d'erreur sur le logCat.

    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
     
     
    08-21 22:03:32.777: D/AndroidRuntime(240): >>>>>>>>>>>>>> AndroidRuntime START <<<<<<<<<<<<<<
    08-21 22:03:32.787: D/AndroidRuntime(240): CheckJNI is ON
    08-21 22:03:33.320: D/AndroidRuntime(240): --- registering native functions ---
    08-21 22:03:33.857: D/ddm-heap(240): Got feature list request
    08-21 22:03:34.287: I/ActivityManager(51): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.virtualbudget/.MainActivity }
    08-21 22:03:34.357: D/AndroidRuntime(240): Shutting down VM
    08-21 22:03:34.357: D/dalvikvm(240): DestroyJavaVM waiting for non-daemon threads to exit
    08-21 22:03:34.357: D/dalvikvm(240): DestroyJavaVM shutting VM down
    08-21 22:03:34.357: D/dalvikvm(240): HeapWorker thread shutting down
    08-21 22:03:34.357: D/dalvikvm(240): HeapWorker thread has shut down
    08-21 22:03:34.357: D/jdwp(240): JDWP shutting down net...
    08-21 22:03:34.367: I/dalvikvm(240): Debugger has detached; object registry had 1 entries
    08-21 22:03:34.386: D/dalvikvm(240): VM cleaning up
    08-21 22:03:34.407: E/AndroidRuntime(240): ERROR: thread attach failed
    08-21 22:03:34.427: I/ActivityManager(51): Start proc com.virtualbudget for activity com.virtualbudget/.MainActivity: pid=248 uid=10028 gids={}
    08-21 22:03:34.447: D/dalvikvm(240): LinearAlloc 0x0 used 639500 of 5242880 (12%)
    08-21 22:03:34.719: D/ddm-heap(248): Got feature list request
    08-21 22:03:35.697: I/ActivityManager(51): Displayed activity com.virtualbudget/.MainActivity: 1280 ms (total 1280 ms)
    08-21 22:03:38.406: I/ActivityManager(51): Starting activity: Intent { cmp=com.virtualbudget/.LesComptes (has extras) }
    08-21 22:03:38.556: I/System.out(248): cursor non null
    08-21 22:03:38.566: I/System.out(248): cursor ok3
    08-21 22:03:38.566: I/System.out(248): cursor ok4
    08-21 22:03:39.061: I/ActivityManager(51): Displayed activity com.virtualbudget/.LesComptes: 612 ms (total 612 ms)
    IHM
    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
     
    db = new DBAdapter(getApplicationContext());
    		db.open();
    		bundle = this.getIntent().getExtras();
    		utilisateur = new Utilisateur();	
    	    compte = new Compte();
     
    	    AddListenerOnBtnAjout();
    	    ListView();
     
    	}
     
    	public void ListView(){
    	    //On récupère les données du Bundle
        	idUtilisateur = (Integer) bundle.get("COL_ID");
     
            	//selectionne liste de compte de l'utilisateur
            	cursor = db.SelectDesComptesUtilisateur(idUtilisateur);
     
            	if(cursor.getCount() != 0){	
            	cursor.moveToFirst();
            	startManagingCursor(cursor);
            	System.out.println("cursor non null");
            	try{
    			SimpleCursorAdapter adapte = new SimpleCursorAdapter(this, R.layout.listeview_compte, cursor, 
    					new String[]{"COL_BANK","COL_TITRE","COL_TOTAL"},new int[]{R.id.TvBank,R.id.TvNom,R.id.TvMontant});
    			System.out.println("cursor ok3");
    			LvCompte = (ListView)findViewById(android.R.id.list);
    			System.out.println("cursor ok4");
    			LvCompte.setAdapter(adapte);
            	}catch(Error e){
            		Log.d("tag", "BOUM !", e);
    			}finally{
    			cursor.close();
    			}
    layout principal
    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
     
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         android:layout_gravity="center_vertical"
        >
     
        <ListView
            android:id="@android:id/list"
            android:layout_width="wrap_content"
            android:layout_height="380dp"
     
            >
     
        </ListView>
     
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
     
        <Button
            android:id="@+id/BtnAjout"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="75dp"
            android:layout_height="48dp"
            android:layout_marginTop="3dp"
            android:layout_marginLeft="35dp"
            android:text="@string/ajout"
            android:textSize="12sp" />
     
        <Button
            android:id="@+id/BtnSup"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="75dp"
            android:layout_height="48dp"
             android:layout_marginLeft="22dp"
             android:layout_marginTop="10dp"
            android:text="@string/supprimer"
            android:textSize="12sp" />
     
        <Button
            android:id="@+id/BtnApercu"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="75dp"
            android:layout_height="48dp"
            android:layout_marginTop="10dp"
             android:layout_marginLeft="22dp"
            android:text="@string/apercu"
            android:textSize="12sp" />
    </LinearLayout>
    </LinearLayout>
    layout secondaire (contenu de ma liste)
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
         >
     
        <RadioButton
            android:id="@+id/RbtnSelect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"  
            android:layout_gravity="center_vertical"
    	   	android:padding="10dp"
    	   	android:layout_marginLeft="10dp"
            android:text="@string/RbtnSelect" />
     
        <LinearLayout 
    	    android:orientation="vertical"
    	    android:layout_width="0dip"
    	    android:layout_height="wrap_content"
    	   	android:layout_gravity="center_vertical"
    	   	android:paddingLeft="10dp"
    	    android:layout_weight="1"
    	    >
     
        <TextView
            android:id="@+id/TvBank"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:text="@string/bank" />
     
        <TextView
            android:id="@+id/TvNom"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:textStyle="bold"
            android:text="@string/nom" />
     
      </LinearLayout>
     
        <TextView
            android:id="@+id/TvMontant"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"  
            android:layout_gravity="center_vertical"
    	   	android:padding="10dp"
            android:text="@string/montant" />
     
    </LinearLayout>
    et enfin ma requete SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     public Cursor SelectDesComptesUtilisateur(int idUtilisateur){
    	   db = database.getReadableDatabase();
    	   String query = " SELECT COL_ID_COMPTE AS _id, COL_BANK, COL_TITRE, COL_TOTAL FROM " + BDD.TABLE_COMPTES + " WHERE COL_ID_UTILISATEUR = ? "; 
    	   String id = Integer.toString(idUtilisateur);
    	   Cursor mCursor = db.rawQuery(query,new String [] {id});
     
    	   return mCursor; 
       }
    Mon cursor n'est pas nul, j'ai bien des infos dans ma base de donnée, si quelqu'un a une idée ?

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur Informatique et Développeur Android
    Inscrit en
    Janvier 2010
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur Informatique et Développeur Android

    Informations forums :
    Inscription : Janvier 2010
    Messages : 384
    Par défaut
    je ne vois pas les messages comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("cursor non null");
    Si tu as des données normalement on aura ce message...
    tu peux ajouter le test si ton curseur est null aussi avec .length =0 et tu affiche un message dans ce cas dans le logcat

  3. #3
    Expert confirmé

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

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

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Pourtant:
    08-21 22:03:38.556: I/System.out(248): cursor non null
    08-21 22:03:38.566: I/System.out(248): cursor ok3
    08-21 22:03:38.566: I/System.out(248): cursor ok4
    Bon... Comme ça de loin je n'en ai aucune idée... (à part le point 1 ci dessous). Par contre, le code est difficile à lire (points 2+).

    1. Essayes de ne pas faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(cursor.getCount() != 0){	
            	cursor.moveToFirst();
    Normalement l'adapter gère le cas lui-même.
    Ne pas faire non plus de "close()" sur le cursor vu qu'il est géré par l'adapter (et que celui ci en aura besoin, si le cursor est closed a la sortie de la fonction point de salut).

    2. Essayes de suivre les règles de nommage (et d'indentation) en Java. Le code est particulièrement illisible sans cela, en particulier: le nom d'un membre (que ce soit une fonction, une variable membre d'un objet) commence toujours par une minuscule (camelCase). Seuls les types (classes,enum,interfaces et donc annotations) commencent par une minuscules (CamelCase). On accepte les '_' et tout majuscule sur les constantes (static final).

    3. On évite en général de préfixer les variables membres avec "m"... et encore plus quand ce ne sont pas des variables membres, juste des variables locales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Cursor mCursor = db.rawQuery(query,new String [] {id});
     
    	   return mCursor;
    (j'ai passé un temps fou à chercher ou il était réutilisé)

    4. Ne jamais utiliser System.out.println().... lui préférer Log.i(). D'autant qu'il y a déjà des appels à Log.e() dans le code, c'est dommage. Le "try" devrait englober l'ensemble de la fonction...
    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
    class MyActivity extends Activity ...
    {
         private static final TAG = MyActivity.class.getSimpleName();
    
         ...
    
         public void fillListView(){
              //On récupère les données du Bundle
              Integer idUtilisateur = (Integer) bundle.get("COL_ID"); // ici idUtilisateur peut être null !
              Log.d(TAG,"Id de l'utilisateur: "+idUtilisateur); // <= utile !
              
              try {
                   // cursor n'est pas déclaré "inline"... c'est donc une variable membre probablement... ce qui est très dangereux (puisqu'il sera géré par l'adapter).
                   Cursor cursor = db.selectDesComptesUtilisateur(idUtilisateur);
     
                   startManagingCursor(cursor);
                   // System.out.println("cursor non null"); <= cursor ne peut pas être null ici de toute manière (on serait déjà dans le catch !)
    
                   SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.listeview_compte, cursor, 
    					new String[]{"COL_BANK","COL_TITRE","COL_TOTAL"},new int[]{R.id.TvBank,R.id.TvNom,R.id.TvMontant});
    
                   listViewComptes = (ListView)findViewById(android.R.id.list);
                   listViewComptes.setAdapter(adapte);
    
              // Pour finir on veut catcher les exceptions, et pas seulement les Error (voir la définition de Error dans Java, rien à voir avec des IOException ou SQLiteException ^^)
              } catch(Exception e) {
                   Log.e(TAG, "Error while setting list of comptes !", e);
              }
    }

  4. #4
    Membre averti
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juin 2013
    Messages : 26
    Par défaut
    Bonjour,

    Merci pour ces infos, j'ai repris une version antérieur de mon appli et mis mon code au propre, ma liste fonctionne. J'ai du trop abusé du bidouillage.

    Par contre, mon activity possède une listview avec des radio button, et un bouton supprimer.

    Quand je click sur le btn supprimer, je veux que ça supprime l'élément de ma liste par son id ou le radio button est séléctionné.
    Pour obtenir l'id de mon élément, je devrais utiliser la méthode setOnClickListener de ma list view. Mais le souci c'est que je l'utilise déjà pour une autre action.

    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
     
    LvCompte.setOnItemClickListener(new OnItemClickListener(){
    				@Override
    	        	@SuppressWarnings("unchecked")
    				public void onItemClick(AdapterView<?> a, View v, int position, long id) {
     
     
    					//méthode pour la liste des transactions
    					//id du compte dans le bundle
    					bundle.putInt("Id_compte",(int) id );
    					Intent intent = new Intent(LesComptes.this, LesTransactions.class);
    					intent.putExtras(bundle);
    					startActivity(intent);
    				}
    			});
    Est-ce que c'est faisable ? et comment est-il possible de procéder pour récupérer l'id par le biais du radiobutton ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/07/2014, 21h31
  2. Réponses: 2
    Dernier message: 21/02/2013, 00h22
  3. SQLite / Cursor / ListView / Adapter
    Par clege dans le forum Composants graphiques
    Réponses: 21
    Dernier message: 14/05/2012, 15h32

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