Aller au contenu

[RESOLU je pense][LISTVIEW] Comment Remplir un ListView avec un cursor


Invité

Recommended Posts

Bonjour à tous,

Je bloque depuis ce matin sur un problème bête ... :mad:

J'ai déjà employé et utilisé les "ListActivity" dans une application,

mais aujourd'hui je voudrais utiliser un "ListView" qui est dans une "Activity" normale.

Je cherche à remplir cette ListView avec des données contenues dans un cursor.

Mon problème, est que je n'arrive pas a faire un adapter correctement...

le listView attend un "listAdapter" ...

J'ai essayé de faire un CursorAdapter mais mon appli plante lors de son instanciation ... :mad:

public class main extends Activity
{
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) 
   {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       //fillList();
       dbActions actions = new dbActions();
       Cursor mCursor = actions.fetchLists(this);
       ListView slList = (ListView) findViewById(R.id.List);
       listCursorAdapter a = new listCursorAdapter(this, mCursor);
       //slList.setAdapter(adapter);
       //slList.setAdapter(new listCursorAdapter(this, mCursor));
   }

public class listCursorAdapter extends CursorAdapter {

   public listCursorAdapter(Context context, Cursor c) {
       super(context, c);
   }
   public listCursorAdapter(Context context, Cursor c, boolean autoRequery) {
       super(context, c, autoRequery);
   }


   @Override
   public void bindView(View view, Context context, Cursor cursor) {
       TextView listId = (TextView)view.findViewById(R.id.listId);
       TextView listName = (TextView)view.findViewById(R.id.listName);
       listId.setText(cursor.getString(cursor.getColumnIndex("uid")));
       listName.setText(cursor.getString(cursor.getColumnIndex("name")));
   }

   @Override
   public View newView(Context context, Cursor cursor, ViewGroup parent) {    
       LayoutInflater inflater = LayoutInflater.from(context);
       View v = inflater.inflate(R.layout.list_row, parent, false);
       bindView(v, context, cursor);
       return v;
   }


}

merci beaucoup ! :|

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres sites

Oups ....

Le seul problème était que eclipse avait ajouté "import android.R" automatiquement :|

Donc pour les R.id.*** c'est résolu ...

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres sites

Puis te manquait slList.setAdapter(a); mais je suppose que tu le savais :).

Oui il arrive que Eclipse te l'ajoute automatiquement (souvent lors de copier/coller d'id notamment), cependant il aurait du te sortir une erreur avant la compilation.

Je te conseille fortement d'utiliser un holder qui te permettra de recycler tes vues et surtout d'éviter de faire à chaque fois findViewById qui est couteux.

Exemple

public class myHolder {

textview mListId;
View view;

public void myHolder(View v)
{
    this.view = v;
}

TextView getId()
{
     if (mListid == null)
     {
            mListid = view.findViewById(R.id.listI);
      }
      return mListid;
}


}

A utiliser avec getTag et setTag.

Dans newView :

           View view = super.newView(context, cursor, parent);
           myHolder holder = new myHolder(view);

           view.setTag(holder);

Dans bindView :

           myHolder holder=(myHolder)view.getTag();

           holder.getId().setText .....

Lien vers le commentaire
Partager sur d’autres sites

Ma liste fonctionne maintenant :)

@akex : merci beaucoup, je vais regarder ca de plus près :P (j'ai jamais vu ca avant :| , j'ai peu d'expérience en dev android ;) )

je donnerais des nouvelles demain :lol:

je travaille sur une application Opensource de "listes de courses" (shopping lists quoi :) )

Lien vers le commentaire
Partager sur d’autres sites

Alors merci encore akex !

J'ai mi en pratique ton code, ca fonctionne :P

Cependant je n'ai pas encore bien compris son fonctionnement, je vais travailler là dessus ;)

Pour l'organisation du code, faut il faire 1 holder par liste ?

(chaque holder s'occupe d'une liste quoi :) )

EDIT @puni :

Le holder stocke les View (textview dans mon cas) pour une liste qui repete plein de fois la meme vue. Ainsi les textview de chaque ligne de la liste sont en mémoire dans le holder.

et comme l'indique akex ca evite de parser le layout avec un FINDVIEWBYID ;)

(@ akex : je pense que j'ai pigé, mais corrige moi si je me trompe)

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres sites

Pourrais-tu détailler un peu ce que fait ton code stp ? Qu'est-ce que cela change par rapport à des findViewById ? Je n'ai jamais entendu parler de cette technique, mais ca a l'air intéressant...

Ca te permet d'économiser en ressource. Pourquoi refaire un findViewById, si android sait déjà où se trouve ton textview ? D'ou l'intéret d'un holder ou wrapper.

Plus d'explications ici : http://www.androidguys.com/2008/07/22/fancy-listviews-part-three/

Lien vers le commentaire
Partager sur d’autres sites

J'ai une autre question :|

Dans ma listview, je liste le contenu d'une table de ma base de donnée (sqlite)

pour identifier l'enregistrement de la bdd qui correspond à une ligne (lorsque l'utilisateur appuie dessus par exemple), je met dans chaque ligne de la liste un textview invisible qui contient l'ID présent en base de données ...

est-ce comme cela que vous faites ? :|

Lien vers le commentaire
Partager sur d’autres sites

Tu peux utiliser un setOnItemClickListener via :

dans onCreate

slList.setOnItemClickListener(this);

L'avantage est que onItemClick prend comme paramètre un adapterView (la listview en l'occurence) et la position du curseur (=position dans la liste). Ce qui te permet donc de récupérer rapidement les infos dont tu as besoin (à condition qu'elles soient contenues dans le curseur).

Tu implémente ensuite la méthode onItemClick

public void onItemClick(AdapterView parent, View v, int position, long id) {
       if (position >= 0) {
           final Cursor c = (Cursor) parent.getItemAtPosition(position);
           id = c.getLong(c.getColumnIndex("uid"));
           //.... ACTION etc.
       }
}   

Cela t'évite d'inflater un TextView qui même invisible coute en terme de performances. L'avantage, tu ne le fais pas pour toutes les lignes visibles à l'écran mais exclusivement sur celle que tu cliques :).

Exemple (avec onItemSelected : http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List7.html)

Bref, tout ça je l'ai trouvé par moi-même via des recherches, car j'étais dans le même cas que toi. Et ça me fait plaisir d'en faire profiter les autres. Si ça continue vais ouvrir un blog dédié à la programmation android :D.

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup ! :D

je vais regarder tout ca en début d'apres midi :P

en effet, au début c'est dur quand on est en phase d'apprentissage,

mais après on ne regrette pas :P

EDIT : Ouai je pense que j'ai compris, c'est plutôt malin comme méthode :cool:

Modifié par Goten44
Lien vers le commentaire
Partager sur d’autres sites

  • 2 weeks later...

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...