Pierre87 Posté(e) 3 mars 2010 Share Posté(e) 3 mars 2010 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 ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 3 mars 2010 Auteur Share Posté(e) 3 mars 2010 Une première idée (de moi), pour vérifier le type de View reçu : placer ce type dans une variable du Holder Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 3 mars 2010 Share Posté(e) 3 mars 2010 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). Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 3 mars 2010 Auteur Share Posté(e) 3 mars 2010 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) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 3 mars 2010 Share Posté(e) 3 mars 2010 Tu pourras poster la solution en code? J'ai toujours du mal avec le jargon développeur :-p Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 3 mars 2010 Auteur Share Posté(e) 3 mars 2010 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 -.- Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 3 mars 2010 Share Posté(e) 3 mars 2010 @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. Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 3 mars 2010 Auteur Share Posté(e) 3 mars 2010 ben la ListView personnalisée, je maitrise :P le problème, c'était la ListView avec des types d'éléments différents ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 3 mars 2010 Share Posté(e) 3 mars 2010 @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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 3 mars 2010 Auteur Share Posté(e) 3 mars 2010 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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 4 mars 2010 Auteur Share Posté(e) 4 mars 2010 @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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 4 mars 2010 Auteur Share Posté(e) 4 mars 2010 j'ai apporté un ptit fix à l'adapter (bug de copier coller) mais sinon il semble marcher ! j'ai ajouté des éléments "à la main", et ça gère facilement plusieurs centaines d'éléments Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Cyril Mottier Posté(e) 5 mars 2010 Share Posté(e) 5 mars 2010 @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 ;) Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 5 mars 2010 Share Posté(e) 5 mars 2010 Si tu changes ton code, remets l'ancien en commentaire, cela permettra de voir l'évolution et améliorations, c'est peut être plus instructif qu'un code "propre" du premier coup! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 5 mars 2010 Auteur Share Posté(e) 5 mars 2010 @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 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Profete162 Posté(e) 5 mars 2010 Share Posté(e) 5 mars 2010 (modifié) Merci, je suis pas encore habitué au SVN.. ca m'aura couté un point karma... Merci pour l'info et tes efforts pour aider, c'est super sympa! Modifié 5 mars 2010 par Profete162 Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 5 mars 2010 Auteur Share Posté(e) 5 mars 2010 si t'as envie que je t'aide à le configurer en direct, ajoutes moi sur msn, c'est la meme adresse que mon mail Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 5 mars 2010 Auteur Share Posté(e) 5 mars 2010 j'ai commit le code "optimisé" Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Rejoignez la conversation
Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.