在微调器中显示对象而不仅仅是字符串

时间:2012-09-20 00:33:29

标签: android android-spinner

我正在用微调器构建一个对话框。对话框完成后,它会使用字符串参数调用父活动的方法 - 参数是所选的字符串值。

我目前的做法:
我正在设置微调器的数组适配器,如下所示:

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

可以有多个Category具有相同的categoryName

问题:如何执行上述操作?

1 个答案:

答案 0 :(得分: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) {}
});