Aller au contenu

ListView et différents type d'éléments


Pierre87

Recommended Posts

Bonjour,

Je considère comme acquis la méthode de "adapter optimisé + holder" :

public View getView(int position, View convertView, ViewGroup parent)
   {
       BluetoothDevicesHolder holder;

       if (convertView == null)
       {
           convertView = this.layoutInflater.inflate(R.layout.bluetoothdevice, null);

           holder = new BluetoothDevicesHolder();
           holder.name = (TextView) convertView.findViewById(R.id.name);
           holder.address = (TextView) convertView.findViewById(R.id.address);

           convertView.setTag(holder);
       }
       else
       {
           holder = (BluetoothDevicesHolder) convertView.getTag();
       }

       BluetoothDevice bluetoothDevice = this.bluetoothDevices.get(position);
       holder.name.setText(bluetoothDevice.getName());
       holder.address.setText(bluetoothDevice.getAddress());

       return convertView;
   }

   private static class BluetoothDevicesHolder
   {
       public TextView name;
       public TextView address;
   }

J'essaye d'intégrer dans une ListView, 2 type d'éléments (A et B par exemple)

Le problème, c'est que je vais avoir 2 layouts (layouta.xml et layoutb.xml)

Et donc, 2 "types" de View.

Quand ma méthode getView() va me passer "convertView", comment lui demander de me passer le bon type de View ?

Si je ne peux pas contrôler le type de View que je reçois, comment distinguer les 2 types ?

Merci !

Lien vers le commentaire
Partager sur d’autres sites

Tu dois tout simplement implémenter des méthodes comme getViewType(int position) et getViewTypeCount(). Si tout est ok, la méthode getView te fournira tout simplement le bon type de convertView.

Pour ce qui est du ViewHolder, tu peux soit en faire tout simplement 2 différents soit faire un gros ViewHolder qui regroupe tous tes attributs pour les vues 1 et 2 (il y aura probablement des attributs inutiles mais ça ne prend pas de place ... ce ne sont que des références :p).

Lien vers le commentaire
Partager sur d’autres sites

Rhaaaaaaaa t'es trop génial !

ça m'apprendra à pas lire la doc à fond ! :s

Effectivement, j'aurais des attributs en commun dans mes 2 types

donc 1 seul holder est suffisant, comme tu le dis

Merci encore pour ta réponse rapide !

(et j'éviterai de te déranger en direct la prochaine fois :P)

Lien vers le commentaire
Partager sur d’autres sites

oui bien sûr

http://code.google.com/p/premotedroid/source/browse/

mais j'ai pas commencé à coder là :P

et ça sera un peu "lourd" car très adapté à mon application

Mais la réponse de Cyril est très claire !

http://developer.android.com/intl/fr/reference/android/widget/Adapter.html

Moi je cherchais du côté de ArrayAdapter -.-

Lien vers le commentaire
Partager sur d’autres sites

@Profete162 : J'ai déjà songé à rédiger un article sur la façon de créer une ListView personnalisée mais je m'étais dit "Non, ça a été rabaché et rabaché, tout le monde sait comment faire maintenant". On dirait qu'un tel article pourrait toujours avoir une utilité :). Je tacherais d'y songer.

Lien vers le commentaire
Partager sur d’autres sites

@Profete162 : J'ai déjà songé à rédiger un article sur la façon de créer une ListView personnalisée mais je m'étais dit "Non, ça a été rabaché et rabaché, tout le monde sait comment faire maintenant". On dirait qu'un tel article pourrait toujours avoir une utilité :). Je tacherais d'y songer.

Bien si, j'arrive à faire des listview avec plein de textes, plein d'images, mais par exemple j'ai du mal pour changer le fond une ligne sur 2 comme Pierre

Lien vers le commentaire
Partager sur d’autres sites

Changer le fond une ligne sur 2, c'est pas vraiment plus compliqué qu'une ListView classique.

Comme dans le getView(), tu as la position... tu peux facilement le deviner !

Dans ton cas, tu as toujours 1 seul type.

Mais n types d'éléments différents, c'est autrement plus compliqué imo

Lien vers le commentaire
Partager sur d’autres sites

@Profete162 : http://code.google.com/p/premotedroid/source/browse/trunk/PRemoteDroid%20Client/src/org/pierre/remotedroid/client/activity/ConnectionListActivity.java

J'ai pas testé encore le code (j'ai rien écris pour ajouter des connections)

mais c'est dans l'idée :P

mail/msn si t'as besoin d'aide pour comprendre

Lien vers le commentaire
Partager sur d’autres sites

@Pierre87 : Ton code de getView pourrait être plus "simple" en factorisant le code. En effet, tu effectue exactement le même travail (avec les instance of) dans getView que celui que tu fais dans getItemViewTyype(). En général, une méthode getView consite à faire directement final int type = getItemViewType(position) puis de faire un switch sur type ;)

Lien vers le commentaire
Partager sur d’autres sites

@Cyril : merci de l'astuce !

j'y avais pas pensé :]

@Profete162 : c'est un depot SVN, donc il garde trace de toutes les modifications

si t'as besoin d'aide pour le configurer / recuperer les données, contactes moi par mail/msn

Lien vers le commentaire
Partager sur d’autres sites

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...