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

jrh*_*ath 0 android android-spinner

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

我目前的方法:
我正在设置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);
Run Code Online (Sandbox Code Playgroud)

categoryNames是一个字符串数组.对话框完成后,selected categoryName将用作父活动上方法调用的参数.

我真正想做的事情:
我真正想要的是显示一个Category对象列表.该Category班有2个属性- categoryIdcategoryName.微调器仍然应该categoryName在下拉视图中显示s,但是当对话框完成后,它应该能够明确地告知Category选择了哪个,并使用categoryId所选类别调用父活动的回调方法.

可以有多个Category相同的categoryName.

问题:如何做到以上?

Sam*_*Sam 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您的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) {}
});
Run Code Online (Sandbox Code Playgroud)