为Spinner项目设置ID

34

我有一个字符串数组,我正在用它来填充Spinner对象。 但是,我想要将ID附加到Spinner的每个元素上,这样当用户选择一个项目时,我就有了它的ID,可以用于保存到其他数据。 我该如何做?


2
我不明白,旋转器或数组位置不足以用作ID? - ferostar
4
这是Spinner中特定物品的ID。它可以是1,也可以是93847549387925187。这是数据库的主键。 - Andrew
1
Andrew,我也有同样的问题...如果你已经得到了答案,请帮帮我... - Haresh Chaudhary
5个回答

47
创建一个名为“StringWithTag”的类,并将其用于列表中的字符串名称的位置,如下所示:
public class StringWithTag {
    public String string;
    public Object tag;

    public StringWithTag(String stringPart, Object tagPart) {
        string = stringPart;
        tag = tagPart;
    }

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

在添加项目到下拉列表部分:-
List<StringWithTag> list = new ArrayList<StringWithTag>();
list.add(new StringWithTag("Oldman", "12345"));
list.add(new StringWithTag("Umpire", "987654"));
list.add(new StringWithTag("Squad", "ABCDEE"));
ArrayAdapter<StringWithTag> adap = new ArrayAdapter<StringWithTag> (this, android.R.layout.simple_spinner_item, list);
....
....

在监听器中:-
public void onItemSelected(AdapterView<?> parant, View v, int pos, long id) {
    StringWithTag s = (StringWithTag) parant.getItemAtPosition(pos);
    Object tag = s.tag;
}

看这里!


5
@Robert... 呃... StringWithTag 是在上面第一个代码块中创建的东西。 - mfc
4
这个解决方案优雅完美!它还实现了类似于 HTML <select> 的 Spinner 键值。 - wildnove
正是我所需要的。谢谢 @mfc - gabi
1
工作得很好。我总是更喜欢内置的结构,但是在这方面,安卓缺乏一个。 - Zapnologica
2
@Violet,所有的类都继承自Object类,并且toString是从Object类继承来的一个方法。 - mfc
显示剩余2条评论

20

你所说的id是什么意思?你可以使用ArrayAdapter来填充Spinner。当选择一个项目时,只需从适配器中获取元素并保存您想要的数据即可。

Spinner spinner = (Spinner) findViewById(R.id.spinner);
ArrayAdapter<MyObject> adapter = ... // initialize the adapter
adapter.setDropDownViewResource(android.R.layout.some_view);
spinner.setAdapter(adapter);

当选择了项目时

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    MyObject selected = parent.getItemAtPosition(pos);
    // save any data relevant with selected item   
}

如果您将数据存储在数据库中,可以使用CursorAdapter,在onItemSelected中从游标中获取所选项目的ID。


2
如果我使用CursorAdapter,我该如何告诉它“name”列是在列表中显示的文本? Translated: - Andrew

0

安德鲁,好久不见,但写下这些话还是值得的。

SpinnerAdapter 中填充 spinnerLayout 时,你可以为每一行设置一个标签:

spinnerView = inflater.inflate(spinnerLayout, parent, false);
spinnerView.setTag("Your Tag");

接着你可以用以下代码获取标签:

yourSpinner.getSelectedView().getTag();

0

我认为你不能将任意ID附加到文本数组资源的元素上,如果你正在使用它。

我认为最简单的方法是要么硬编码(如果你正在使用静态文本资源),要么动态构建(如果你在运行时获取字符串)从(数组中的字符串位置)->(主键)的映射来附加这样的ID。

编辑:另一方面,Mojo Risin有一点 - 你应该检查看看CursorAdapter API是否已经为你提供了所需的功能。


-2
我认为最好的解决方案是添加一个额外的下拉框,并将其填充为ID,但将其可见性设置为隐藏。

1
我不这样认为...如果您有一个对象数组要在下拉框中显示,从该对象数组中更容易访问所选 ID,而不是访问另一个下拉框中的值。 - hendrix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接