Aller au contenu

Créer des sérateurs dans une spinner


Gabin

Recommended Posts

Bonjour,

Je cherche comment créer des séparateurs dans une spinner, auriez une idée ?

J'ai vu qu'il était possible de faire ça avec une ListView.

Le but c'est d'obtenir un truc du genre :

/*Imaginez que c'est une spinner (l'alertDialog de la spinner) */

<separateur>Langues</separateur>
<item>Français</item>
<item>Anglais</item>
<item>Espagnol</item>
<item>Allemand</item>
<item>Chinois</item>
<item>...</item>

<separateur>Sciences</separateur>
<item>Maths</item>
<item>Physique</item>
<item>Chimie</item>
<item>Electronique</item>
<item>...</item>

Merci à vous ;)

Lien vers le commentaire
Partager sur d’autres sites

Je penses que tu pourrais passer par ta propre implémentation d'Adapter. En redéfinissant la méthode getItemViewType pour qu'elle retourne l'id du layout pour la vue d'un élément, en fonction de sa position. Il faut pour cela que les éléments que tu insères dans ton Adapter te permettent de faire la différence entre séparateur et données.

(Et tu auras aussi la méthode isEnabled à redéfinir pour invalider les séparateurs et les rendre non sélectionnables)

Lien vers le commentaire
Partager sur d’autres sites

Quel est le type d'Adapter que tu utilises actuellement ? ArrayAdapter ? Quel est le type de données que tu y mets ? Des String ?

Moi, je verrai le truc comme ça:

- tu te crées une classe Item, qui va correspondre à la description d'une entrée dans ton Spinner, et qui permettra de dire si c'est une entrée normale ou un séparateur

public class MonItem {
 private String valeur;
 private boolean separateur;

 public MonItem(String pValeur, boolean pSeparateur) {
   valeur = pValeur;
   separateur = pSeparateur;
 }

 public String toString() {
   return valeur;
 }

 public boolean isSeparateur() {
   return separateur;
 }
}

- tu te crées une classe MonAdapter dérivant de ArrayAdapter<MonItem> en redéfinissant getItemViewType et isEnabled

public class MonAdapteur extends ArrayAdapter<MonItem> {

 public MonAdapteur(Context context) {
   super(context, 0);
}

public int getItemViewType(int position) {
  MonItem item = getItem(position);
  return item.isSeparateur() ? R.layout.le_layout_pour_separateur : R.layout.le_layout_pour_entree_normale;
}
public boolean isEnabled(int position) {
  MonItem item = getItem(position);
 return !item.isSeparateur();
}
}

- ensuite, quand tu initialises ton Spinner, tu construits une liste d'objets MonItem, correspondant aux entrées et séparateurs que tu insères dans une instance de MonAdapter,

- tu passes ton Adapter à ton Spinner

... et tu croises les doigts pour que tout ça marche ;) (je ne garantis pas que tout est correct, mais l'idée est là, je te laisse débugger... )

Lien vers le commentaire
Partager sur d’autres sites

Alors en fait pour j'instancie mes spinners comme cela :

               ArrayAdapter<CharSequence> spCompAsubAdapter = ArrayAdapter.createFromResource(this, R.array.sta_composante_asub, android.R.layout.simple_spinner_item);
	spCompAsubAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
	sp_composante_asub.setAdapter(spCompAsubAdapter);

sinon en reprenant bêtement ton code je me retrouve avec ça :

Pour différencier mon séparateur des mes données, je me demandais si je pourrais pas mettre un "-" devant le titre de chaque séparateur.

Je pourrais ainsi essayer de lire le premier caractère de chaque item et si c'est "-", lui assigner le sp_item_sep.xml .

public class ItemSpinner {
	private String valeur;
	private boolean separateur;

	public ItemSpinner(String pValeur, boolean pSeparateur) {
		valeur = pValeur;
		separateur = pSeparateur;
	}

	public String toString() {
		return valeur;
	}

	public boolean isSeparateur() {

		if ( valeur.charAt(0)!= "-"  /* un petit essais de condition */
		{
			separateur = true;
		}

		else
		{
			separateur = false;
		}

		return separateur;
	}
}

public class AdapterSpinner extends ArrayAdapter<CharSequence> {

	public AdapterSpinner(Context context) {
		super(context, 0);
	}

	public int getItemViewType(int position) {
		ItemSpinner item = getItem(position); /* j'ai une erreur avec le getItem(position) */
		return item.isSeparateur() ? R.layout.sp_item_sep : R.layout.sp_item_normal;
	}
	public boolean isEnabled(int position) {
		ItemSpinner item = getItem(position); /* j'ai une erreur avec le getItem(position) */
		return !item.isSeparateur();
	}
}

J'ai encore bien du mal avec java... y'a du boulot ! :P

Merci pour ton aide ;)

Lien vers le commentaire
Partager sur d’autres sites

Pour l'erreur de compilation (que tu aurais pu indiquer ;), mais je suppose que c'est qqchose comme 'Cannot cast CharSequence to ItemSpinner' ...), modifie:

public class AdapterSpinner extends ArrayAdapter<CharSequence> {

en

public class AdapterSpinner extends ArrayAdapter<ItemSpinner> {

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