Jump to content

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


Guest

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 ! :|

Edited by Goten44
Link to comment
Share on other sites

Oups ....

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

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

Edited by Goten44
Link to comment
Share on other 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 .....

Link to comment
Share on other 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 :) )

Link to comment
Share on other 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)

Edited by Goten44
Link to comment
Share on other 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/

Link to comment
Share on other 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 ? :|

Link to comment
Share on other 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.

Link to comment
Share on other 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:

Edited by Goten44
Link to comment
Share on other sites

  • 2 weeks later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...