2010-03-18 101 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