Aller au contenu

Spinner : drop down item personnalisé


®om

Recommended Posts

Salut,

Je débute sur Android, et je voudrais faire quelque chose de très simple.

J'ai une combobox, quand je clique dessus, j'ai la liste des éléments qui s'ouvre dans une "popup", et je dois en choisir un (un radio bouton est affiché à droite).

Jusque là, tout va bien.

1129549963.png

Maintenant, je voudrais personnaliser le renderer de cette liste, pour y mettre une image (dépendant de l'item) à la place du radiobutton.

Par exemple, si j'ai une liste de "luminosité" avec comme valeur "faible", "moyenne" et forte", je veux mettre une image d'ampoule à faible luminosité, à moyenne luminosité et à forte luminosité, respectivement (pour l'instant je fais le test avec un simple bouton contenant la position, mais la difficulté n'est pas là).

J'ai donc créé un layout personnalisé (item.xml) :

<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="horizontal"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">
   <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="TextView" android:id="@+id/textView1" android:layout_weight="1"></TextView>
   <Button android:layout_height="wrap_content" android:id="@+id/button1" android:layout_width="wrap_content" android:text="Button"></Button>
</LinearLayout>

et un adapter personnalisé :

public class BrightnessAdapter extends BaseAdapter {

private Context context;
private String[] data;
private LayoutInflater inflater;

public BrightnessAdapter(Context context, String[] data) {
	this.context = context;
	this.data = data;
	inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
	return data.length;
}

@Override
public String getItem(int position) {
	return data[position];
}

@Override
public long getItemId(int position) {
	return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
	if (convertView == null) {
		convertView = inflater.inflate(R.layout.item, parent, false);
	}

	TextView label = (TextView) convertView.findViewById(R.id.textView1);
	Button button = (Button) convertView.findViewById(R.id.button1);

	label.setText(getItem(position));
	button.setText(String.valueOf(position));

	return convertView;
}
}

que j'appelle ainsi dans mon Activity :

	public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	Spinner spinner = (Spinner) findViewById(R.id.spinner1);
	String[] data = getResources().getStringArray(R.array.brightnesses);
	spinner.setAdapter(new BrightnessAdapter(this, data));
	spinner.setOnItemSelectedListener(new BrightnessSelectedListener());
}

Graphiquement, ça fonctionne :

1129553305.png

Par contre je n'ai plus aucun événement (c'est sans doute normal), quand je clique sur un item, il ne se passe rien, la popup ne se ferme pas.

Comment donc brancher manuellement les événements "qui-vont-bien" ?

Dois-je ajouter un listener à la fois sur le textfield et sur le bouton ?

Que dois-je faire sur le handler pour :

- fermer la popup

- retourner l'élément sélectionné (et sa position)

- que le fond de l'item change de couleur lorsqu'on clique dessus, comme dans le comportement par défaut (faut-il le faire manuellement ou peut-on réutiliser le comportement par défaut d'une manière ou d'une autre)

- avoir l'icône par défaut (la petite flèche) à droite du combobox (cf premier screenshot), plutôt que le "bouclier" (cf second screenshot). On dirait un problème de .png.9, que la partie du milieu de la flèche a été étirée (alors que je veux la centrer)

Merci.

Lien vers le commentaire
Partager sur d’autres sites

Par contre je n'ai plus aucun événement (c'est sans doute normal), quand je clique sur un item, il ne se passe rien, la popup ne se ferme pas.

Il doit falloir dire à tes vues (text & button) qu'elles ne doivent pas capter les events. Essaie de leur ajouter :

 android:focusable = "false"
android:clickable = "false"

Ainsi le fonctionnement de base devrait être conservé et la popup se fermer :)

Lien vers le commentaire
Partager sur d’autres sites

Moi je ne comprends pas bien pourquoi tu ajoutes un type de contrôleur suplémentaire. La liste gère déjà très bien les events, si tu veux y ajouter une illustration, pourquoi passer par des boutons alors que les imageViews servent à ça ?

Après j'ai peut-être mal compris mais tes boutons n'ont pas pour but de générer un évenement supplémentaire du choix de base ?

En gros, ce que je veux dire (parce que je crois que je suis pas super clair :D ) c'est qu'avant de chercher une solution à ce problème, implémente directement ce que tu veux (des images en l'occurence) et les conflits d'events s'en iront sans nul doute ^^

Lien vers le commentaire
Partager sur d’autres sites

Il doit falloir dire à tes vues (text & button) qu'elles ne doivent pas capter les events. Essaie de leur ajouter :

 android:focusable = "false"
android:clickable = "false"

Ainsi le fonctionnement de base devrait être conservé et la popup se fermer :)

Merci beaucoup, ça fonctionne \o/

Moi je ne comprends pas bien pourquoi tu ajoutes un type de contrôleur suplémentaire. La liste gère déjà très bien les events, si tu veux y ajouter une illustration, pourquoi passer par des boutons alors que les imageViews servent à ça ?

Après j'ai peut-être mal compris mais tes boutons n'ont pas pour but de générer un évenement supplémentaire du choix de base ?

En gros, ce que je veux dire (parce que je crois que je suis pas super clair :D ) c'est qu'avant de chercher une solution à ce problème, implémente directement ce que tu veux (des images en l'occurence) et les conflits d'events s'en iront sans nul doute ^^

Non mais c'était pour l'exemple, je n'avais pas d'image sous la main, j'ai mis un bouton (mais de toute façon je cliquais sur la partie TextView).

Problème résolu. Merci ;-)

(Enfin il reste encore le problème de la flèche de droite du ComboBox qui n'apparaît pas correctement quand le contenu prend plus de place en hauteur)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...