Dans l'interface utilisateur, il doit y avoir un spinner qui contient des noms (les noms sont visibles) et chaque nom a son propre ID (les ID ne sont pas égaux à la séquence d'affichage). Lorsque l'utilisateur sélectionne le nom dans la liste, la variable currentID doit être modifiée.
L'application contient la ArrayList
Où User est un objet avec ID et nom:
public class User{
public int ID;
public String name;
}
Ce que je ne sais pas, c'est comment créer un spinner qui affiche la liste des noms d'utilisateurs et lier les éléments de spinner aux ID, de sorte que lorsque l'élément de spinner est sélectionné / modifié, la variable currentID est définie sur la valeur appropriée.
J'apprécierais si quelqu'un pouvait montrer la solution du problème décrit ou fournir tout lien utile pour résoudre le problème.
Merci!
Réponses:
Vous pouvez regarder cette réponse . Vous pouvez également utiliser un adaptateur personnalisé, mais la solution ci-dessous convient aux cas simples.
Voici une nouvelle publication:
Donc, si vous êtes venu ici parce que vous voulez avoir à la fois des étiquettes et des valeurs dans le Spinner, voici comment je l'ai fait:
Spinner
façon habituellearray.xml
fichier - un tableau pour les étiquettes, un tableau pour les valeursSpinner
avecandroid:entries="@array/labels"
Lorsque vous avez besoin d'une valeur, faites quelque chose comme ça (non, vous n'avez pas à l'enchaîner):
la source
Je sais que le fil est vieux, mais juste au cas où ...
Objet utilisateur:
Adaptateur Spinner personnalisé (ArrayAdapter)
Et la mise en œuvre:
la source
Skipped 317 frames! The application may be doing too much work on its main thread.
Des idées?Solution la plus simple
Après avoir parcouru différentes solutions sur SO, j'ai trouvé que ce qui suit était la solution la plus simple et la plus propre pour peupler un
Spinner
avec personnaliséObjects
. Voici l'implémentation complète:User.java
res / layout / spinner.xml
res / layout / your_activity_view.xml
Dans votre activité
la source
currentID
dès que la valeur du Spinner change. La plupart du temps, vous n'avez besoin de la valeur du Spinner qu'après avoir appuyé sur un bouton, tel que Soumettre ou Enregistrer , pas immédiatement après les modifications du Spinner et si cela peut être évité, cela fournit une solution beaucoup plus simple.getSelectedItem()
appel. Merci pour le conseil.Pour des solutions simples, vous pouvez simplement écraser le "toString" dans votre objet
et ensuite vous pouvez utiliser:
De cette façon, votre spinner affichera uniquement les noms d'utilisateurs.
la source
De loin le moyen le plus simple que j'ai trouvé:
Vous pouvez maintenant coller n'importe quel objet dans votre spinner, et il affichera l'étiquette spécifiée.
la source
Une petite modification de la réponse de Joaquin Alberto peut résoudre le problème de style.Remplacez simplement la fonction getDropDownView dans l'adaptateur personnalisé comme ci-dessous,
la source
Fonctionne bien pour moi, le code nécessaire autour de la chose getResource () est le suivant:
Il suffit de s'assurer (par vous-même) que les valeurs des deux tableaux sont correctement alignées!
la source
inspiré par Joaquin Alberto, cela a fonctionné pour moi:
la source
Basé sur l'exemple de Joaquin Alberto (merci), mais il fonctionne pour n'importe quel type (vous devez implémenter toString () dans le type, afin de pouvoir formater la sortie.
Aussi, je pense que vous pouvez remplacer List par Array afin que vous n'ayez pas besoin de faire toArray in List, mais j'avais une liste ..... :)
la source
Pour comprendre l'astuce, il faut savoir comment fonctionnent les adaptateurs en général et ArrayAdapter en particulier.
Adaptateurs: sont des objets capables de lier des structures de données à des widgets, puis ces widgets affichent ces données dans une liste ou dans un Spinner.
Les deux questions auxquelles répond un adaptateur sont donc:
EditText
du widget ou de la vue composite en fonction de ces données?Les réponses d'ArrayAdapter sont:
row.xml
ORandroid.R.layout.simple_spinner_item
) pour n'importe quel index est le même, et est gonflé à partir de la ressource dont l'ID a été donné au constructeur d'ArrayAdapter..setText()
méthode du widget sera utilisée avec le format de chaîne de l'élément dans la structure de données de support. Le format de chaîne sera obtenu en appelant.toString()
sur l'élément.CustomListViewDemo.java
adaptor_content.xml
main.xml
Cela fonctionne correctement, j'espère que c'est utile.
la source
Mon objet personnalisé est
Je voulais également définir cet objet comme source de mon adaptateur pour mon spinner sans étendre ArrayAdapter afin que ce que j'ai fait l'était.
Maintenant, vous pourrez voir les résultats dans votre spinner, l'astuce était de remplacer
toString()
dans votre objet personnalisé , donc quelle que soit la valeur que vous souhaitez afficher dans le spinner, retournez simplement cela dans cette méthode.la source
Je pense que la meilleure solution est la " solution la plus simple" de Josh Pinter .
Cela a fonctionné pour moi:
la source
Si vous n'avez pas besoin d'une classe séparée, je veux dire juste un simple adaptateur mappé sur votre objet. Voici mon code basé sur les fonctions ArrayAdapter fournies.
Et parce que vous devrez peut-être ajouter un élément après la création de l'adaptateur (par exemple, chargement asynchrone d'un élément de base de données).
Simple mais efficace.
Et puis vous pouvez utiliser ce code (je n'ai pas pu mettre Category [] dans le constructeur de l'adaptateur car les données sont chargées séparément).
Notez que adapter.addAll (items) actualise le spinner en appelant notifyDataSetChanged () en interne.
la source
Faire:
la source