2012-09-20 54 views
0

我正在用微調框構建對話框。當對話框完成時,它使用字符串參數調用父活動的方法 - 參數是所選的字符串值。在微調框中顯示對象而不僅僅是字符串

我目前的做法:
我設置了微調的陣列適配器像這樣:

ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, 
    categoryNames);  

adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
mySpinner.setAdapter(adapter); 

categoryNames是一個字符串數組。完成對話後,所選的categoryName將用作父活動方法調用的參數。

我真正想做的事:
什麼其實我想要的是顯示Category對象的列表。 Category類有2個屬性 - categoryIdcategoryName。微調器仍然應該在下拉視圖中顯示categoryName,但是當完成對話時,它應該能夠明確地指出哪個Category被選中,並且用所選類別的categoryId調用父活動的回調方法。

可以有多個CategorycategoryName相同。

問題:如何做到上述?

+0

雖然我已經張貼了答案,如果類別名稱不是唯一的,用戶_將如何區分同名(例如「音樂」和「音樂」)? – Sam

+0

我使用了「category」和「categoryName」隱喻來簡化我的使用案例:) – jrharshath

回答

9

有幾種不同的方式做你想要什麼:

  • 商店適配器中額外的數據,如SimpleAdapter,SimpleCursorAdapter,或自定義一個。
  • 使用一組自定義對象而不是字符串,只需重寫toString()方法以在Spinner中顯示用戶可讀的字符串。

你似乎想要做的第二個選項,所以這裏是一個普通的例子:

class Category { 
    int id; 
    String name; 

    public Category(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 
} 

你ArrayAdapter幾乎是一樣的:

List<Category> categories = new ArrayList<Category>(); 
// Add new items with: categories.add(new Category(0, "Stack"); 

ArrayAdapter<Category> adapter = 
     new ArrayAdapter<Category>(getActivity(), android.R.layout.simple_spinner_item, 
     categories); 

... 
mySpinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
     Category category = parent.getItemAtPosition(position); 
     Log.v("Example", "Item Selected id: " + category.id + ", name: " + category.name); 
    } 

    public void onNothingSelected(AdapterView<?> parent) {} 
}); 
+0

嗯,這給我帶來了第二個挑戰:當我將一個'Category'對象數組傳遞給我的對話框片段(這是我的對話框),我如何將它存儲在片段的'arguments'中?我找不到任何'Bundle#setObjectArray()'方法.. – jrharshath

+0

Ha!我剛剛回答了[另一個問題](http://stackoverflow.com/a/12503875/1267661)使用Bundles傳遞自定義對象的ArrayList。 – Sam

+0

找到你對答案的解釋非常有幫助:) 爲了記錄,我使用了toString()方法(儘管從純粹的角度來看,這不是真正的解決方案)。如果你可以指點一些如何構建自定義適配器的例子,那將是非常棒的。 – jrharshath

相關問題