2010-03-18 38 views
2

我在Spinner widget中遇到了一些麻烦。考虑下面的代码:Android Bind Spinner to Class

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); 
    } 

我用下面的代码将其绑定到一个微调:

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

我想是的值(ID)被隐藏,但传递时选择,并显示名称。任何帮助表示赞赏。

谢谢。

回答

11

如果我正确理解您的问题,您希望名称出现在微调器下拉列表中。选择某个项目时,您想返回该ID。

有两种方法可以解决这个问题。

最简单的方法是实现一个toString(),它返回Person对象中的名称。将对象的文本值绑定到下拉视图时,ArrayAdapter将返回此值。 然后在您的活动中,您可以为Spinner设置onItemClickListener,并调用adapter.getItemAtPosition(position)来检索Person对象。从这个人的对象,你可以得到你的ID。

第二种方法是扩展ArrayAdapter并实现getView和getDropDownView和getItem方法。 getView负责创建您在单击微调器时看到的行。 getDropDownView负责创建您在微调器中看到的视图。 getItem方法将返回对象,或者在您的情况下返回指定位置的id。您应该将Person元素的名称绑定到getView和getDropDownView方法中的textview。在创建自定义ArrayAdapter之后,您应该为Spinner设置onItemClicKListener并像上面提到的那样处理它。

第一种方法很简单,但第二种方法要优越得多,并且会对您的适配器产生更大的控制力,特别是当您开始开发更复杂的东西时。

希望有所帮助。

+0

我得到的考察,但我在使用的实施麻烦。你有什么代码可以帮助我? – drbob

+0

我真的很喜欢第一种方法。它几乎可以在.NET中进行数据绑定 - 利用WPF和Silverlight中的MVVM。在这种情况下,你巧妙地公开了你想要在toString()实现中显示的一个属性,但是在ArrayAdapter中保留完整的对象以供稍后处理......我认为这是关键。没有维护和同步两个ArrayLists ... –

2

很旧的文章 - 刚刚碰到寻找别的东西 - noiced一个错误(可能只是监督)

jagsund大多是正确的,接受的,他得到了getView和GetDropDownView错误的definion - 它实际上是与他所说的相反:getView显示微调控件内的内容,getDropDownView创建单击微调控件时看到的视图行。

所以,除非你点击微调,getDropDownView甚至不会被调用 - 你会看到这一点,如果你重写ArrayAdapter