Jump to content

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 !

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

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

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

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

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

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

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

Link to comment
Share on other sites

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