2010-03-18 8 views
2

J'ai des problèmes avec le widget Spinner. Vu le code suivant:Android Bind Spinner à la classe

ArrayList<Person> people= new ArrayList<Person>(); 

    Person = null; 
    for(int i = 0; i!= 10; i++) { 
     p = new Person(); 
     s.setID(i); 
     s.setName("Name " + i); 
     people.add(s); 
    } 

J'utilise le code suivant pour le lier à un Spinner:

Spinner spinner1 = (Spinner) findViewById (R.id.spinner);  
ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_spinner_item, people);       
spinner1.setAdapter(adapter); 

Ce que je voudrais est la valeur (id) pour être caché, mais passé quand sélectionné et le nom à afficher. Toute aide est appréciée.

Merci.

Répondre

11

Si je comprends bien votre question, vous aimeriez que le nom apparaisse dans la liste déroulante du spinner. Lorsqu'un élément est sélectionné, vous souhaitez retourner l'identifiant.

Il existe deux façons d'aborder cette question.

La méthode la plus simple consiste à implémenter un toString() qui renvoie le nom dans votre objet Person. ArrayAdapter renverra cette valeur lors de la liaison des valeurs de texte de votre objet à la vue déroulante. Ensuite, dans votre activité, vous pouvez définir onItemClickListener pour le Spinner et appeler l'adaptateur .getItemAtPosition (position) pour récupérer l'objet Person. De cet objet de personne vous pouvez obtenir votre identification.

La deuxième approche consiste à étendre l'ArrayAdapter et à implémenter les méthodes getView et getDropDownView et getItem. Le getView est responsable de la création des lignes que vous voyez lorsque vous cliquez sur le spinner. Le getDropDownView est responsable de la création de la vue que vous voyez dans le spinner. Et la méthode getItem retournera l'objet ou dans votre cas l'identifiant à cette position spécifiée. Vous devez lier le nom de l'élément Person à un textview dans vos méthodes getView et getDropDownView. Après avoir créé votre ArrayAdapter personnalisé, vous devez définir le onItemClicKListener pour le Spinner et le gérer comme je l'ai mentionné ci-dessus.

La première approche est simple mais la deuxième approche est de loin supérieure et donnera un meilleur contrôle sur votre adaptateur, surtout lorsque vous commencez à développer quelque chose de beaucoup plus complexe.

Espérons que ça aide.

+0

je reçois le theroy, mais je ne parviens pas à la mise en œuvre. Avez-vous du code pour m'aider? – drbob

+0

J'ai vraiment aimé la première approche. Il sent presque la connexion de données sur .NET - en exploitant MVVM dans WPF et Silverlight. Dans ce cas, vous exposez intelligemment la propriété que vous souhaitez afficher dans l'implémentation toString(), mais gardez l'objet complet dans l'ArrayAdapter pour une manipulation ultérieure ... ce qui me semble être la clé. Pas de maintenance et de synchronisation de deux ArrayLists ... –

2

poste très ancien - vient à travers la recherche de quelque chose d'autre - noiced une erreur (probablement surveillance)

jagsund est le plus souvent droit, accepter, il a obtenu le définion de mal getView et GetDropDownView - est en fait la Contrairement à ce qu'il a dit: getView montre le contenu à l'intérieur du contrôle spinner, getDropDownView crée les lignes d'affichage que vous voyez lorsque vous cliquez sur le spinner.

Donc, à moins que vous cliquez sur la fileuse, getDropDownView ne sera même pas obtenir appelé - vous verrez si vous substituez ArrayAdapter