Pierre87 Posted March 3, 2010 Share Posted March 3, 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 ! Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 3, 2010 Author Share Posted March 3, 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 Quote Link to comment Share on other sites More sharing options...
Cyril Mottier Posted March 3, 2010 Share Posted March 3, 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). Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 3, 2010 Author Share Posted March 3, 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) Quote Link to comment Share on other sites More sharing options...
Profete162 Posted March 3, 2010 Share Posted March 3, 2010 Tu pourras poster la solution en code? J'ai toujours du mal avec le jargon développeur :-p Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 3, 2010 Author Share Posted March 3, 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 -.- Quote Link to comment Share on other sites More sharing options...
Cyril Mottier Posted March 3, 2010 Share Posted March 3, 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. Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 3, 2010 Author Share Posted March 3, 2010 ben la ListView personnalisée, je maitrise :P le problème, c'était la ListView avec des types d'éléments différents ! Quote Link to comment Share on other sites More sharing options...
Profete162 Posted March 3, 2010 Share Posted March 3, 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 Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 3, 2010 Author Share Posted March 3, 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 Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 4, 2010 Author Share Posted March 4, 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 Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 4, 2010 Author Share Posted March 4, 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 Quote Link to comment Share on other sites More sharing options...
Cyril Mottier Posted March 5, 2010 Share Posted March 5, 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 ;) Quote Link to comment Share on other sites More sharing options...
Profete162 Posted March 5, 2010 Share Posted March 5, 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! Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 5, 2010 Author Share Posted March 5, 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 Quote Link to comment Share on other sites More sharing options...
Profete162 Posted March 5, 2010 Share Posted March 5, 2010 (edited) 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! Edited March 5, 2010 by Profete162 Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 5, 2010 Author Share Posted March 5, 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 Quote Link to comment Share on other sites More sharing options...
Pierre87 Posted March 5, 2010 Author Share Posted March 5, 2010 j'ai commit le code "optimisé" Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.