j0o0 Posté(e) 30 janvier 2011 Share Posté(e) 30 janvier 2011 Bonjour à tous, Je continue mon apprentissage de l'API android, voici ce que j'aimerais faire : lorsqu'un item d'une ListView est cliqué/sélectionné, je voudrais changer sa couleur de fond (pour indiquer quel item de la liste est sélectionné). L'item garderait cette nouvelle couleur jusqu'à ce qu'un autre item soit cliqué/sélectionné... J'ai essayé plusieurs façons de faire, notamment en changeant le fond dans un AdapterView.OnItemClickListener, le problème est que lorsque l'adapteur recycle les vues (cf. le paramètre convertView de Adapter.getView), la vue avec le fond modifié réapparaît autre part dans la ListView. J'ai également essayé d'utiliser l'attribut android:listSelector, mais l'item ne change de couleur que pendant la durée du clic... Quelle est la solution à ce problème ? Merci ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
ichpa Posté(e) 31 janvier 2011 Share Posté(e) 31 janvier 2011 Bonjour, Je pense que la résolution de ton problème passe plus par la modification des layouts/styles. Premièrement, pour obtenir une liste avec simple sélection, la méthode onCreate(Bundle) de ta ListActivité doit ressembler à cela : setListAdapter(<MonAdapter avec android.R.layout.simple_list_item_single_choice>)); final ListView listView = getListView(); listView.setItemsCanFocus(false); listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); Ensuite si la puce de sélection ne te convient pas, tu peux créer ton propre layout à la place de layout.simple_list_item_single_choice. Mais attention il devra obligatoirement étendre de la classe CheckedTextView(pour que l'item soit "checkable"). Pour changer le fond d'écran en fonction de la sélection, je pense qu'il suffit juste de mettre un nouveau drawable en fond de ton nouveau layout (item) qui prend en charge le "checkage". Le fond d'écran par défaut d'un item d'une liste est : <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_window_focused="false" android:drawable="@color/transparent" /> <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. --> <item android:state_focused="true" android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_disabled" /> <item android:state_focused="true" android:state_enabled="false" android:drawable="@drawable/list_selector_background_disabled" /> <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" /> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/list_selector_background_transition" /> <item android:state_focused="true" android:drawable="@drawable/list_selector_background_focus" /> </selector> Il faut donc ajouter quelque chose comme cela : <item android:state_checked="true" android:state_window_focused="false" android:drawable="@drawable/mon_drawable_on" /> <item android:state_checked="false" android:state_window_focused="false" android:drawable="@drawable/mon_drawable_off" /> <item android:state_checked="true" android:state_pressed="true" android:drawable="@drawable/mon_drawable_on_pressed" /> <item android:state_checked="false" android:state_pressed="true" android:drawable="@drawable/mon_drawable_off_pressed" /> <item android:state_checked="true" android:state_focused="true" android:drawable="@drawable/mon_drawable_on_selected" /> <item android:state_checked="false" android:state_focused="true" android:drawable="@drawable/mon_drawable_off_selected" /> <item android:state_checked="false" android:drawable="@drawable/mon_drawable_off" /> <item android:state_checked="true" android:drawable="@drawable/mon_drawable_on" /> Bon courage, ichpa Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
j0o0 Posté(e) 31 janvier 2011 Auteur Share Posté(e) 31 janvier 2011 Je vais explorer cette piste, merci beaucoup ! Citer Lien vers le commentaire Partager sur d’autres sites More sharing options...
j0o0 Posté(e) 1 février 2011 Auteur Share Posté(e) 1 février 2011 En fait je ne comprends pas trop comment un layout peut herite de CheckedTextView...Au lieu de ca, j'ai fait herite mon layout de LinearLayout et ai implemente l'interface Checkable : public class CheckableLayout extends LinearLayout implements Checkable { private boolean mIsChecked; public CheckableLayout(Context context) { super(context); } public CheckableLayout(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean isChecked() { return mIsChecked; } @Override public void setChecked(boolean checked) { mIsChecked = checked; //if (checked) // this.setBackgroundColor(Color.GRAY); //else // this.setBackgroundColor(Color.TRANSPARENT); } @Override public void toggle() { mIsChecked = !mIsChecked; } } Ainsi le layout pour les items de la liste ressemble a : <?xml version="1.0" encoding="utf-8"?> <fr.jr.test2.CheckableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/checkable_selector"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </fr.jr.test2.CheckableLayout> Et checkable_selector (le fond du layout) : <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:state_window_focused="false" android:drawable="@color/red" /> <item android:state_checked="false" android:state_window_focused="false" android:drawable="@color/black" /> <item android:state_checked="true" android:state_pressed="true" android:drawable="@color/red" /> <item android:state_checked="false" android:state_pressed="true" android:drawable="@color/black" /> <item android:state_checked="true" android:state_focused="true" android:drawable="@color/red" /> <item android:state_checked="false" android:state_focused="true" android:drawable="@color/black" /> <item android:state_checked="false" android:drawable="@color/black" /> <item android:state_checked="true" android:drawable="@color/red" /> </selector> Malheureusement cela ne fonctionne pas, le selecteur ne semble jamais se trouver dans l'etat "checked". J'ai trouve une solution alternative en changeant le background du layout directement dans le code (cf. commentaires de la methode setChecked), mais pouvoir utiliser un selecteur serait encore mieux. SI quelqu'un a une idee... 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.