如何按值而不是按位置设置 Spinner 的选定项目?
我有一个更新视图,我需要在其中为微调器预先选择数据库中存储的值。
我想到了这样的事情,但是 Adapter 没有 indexOf 方法,所以我被困住了。
void setSpinner(String value)
{
int pos = getSpinnerField().getAdapter().indexOf(value);
getSpinnerField().setSelection(pos);
}
I have a update view, where I need to preselect the value stored in database for a Spinner.
I was having in mind something like this, but the Adapter
has no indexOf
method, so I am stuck.
void setSpinner(String value)
{
int pos = getSpinnerField().getAdapter().indexOf(value);
getSpinnerField().setSelection(pos);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(25)
假设您的
Spinner
名为mSpinner
,并且它包含以下选项之一:“某些值”。要查找并比较微调器中“某个值”的位置,请使用以下命令:
Suppose your
Spinner
is namedmSpinner
, and it contains as one of its choices: "some value".To find and compare the position of "some value" in the Spinner use this:
根据值设置微调器的一种简单方法是
复杂代码已经存在的方法,这更加简单。
A simple way to set spinner based on value is
Way to complex code are already there, this is just much plainer.
根据 Merrill 的回答,我想出了这个单行解决方案......它不是很漂亮,但你可以责怪任何人维护
Spinner
的代码,因为忽略了包含为此执行此操作的函数。您将收到一条警告,说明如何未检查对
ArrayAdapter
的转换...实际上,您可以像 Merrill 那样使用ArrayAdapter
,但这只是将一个警告换成另一个警告。如果警告导致问题,只需添加
到方法签名或语句上方。
Based on Merrill's answer, I came up with this single line solution... it's not very pretty, but you can blame whoever maintains the code for
Spinner
for neglecting to include a function that does this for that.You'll get a warning about how the cast to a
ArrayAdapter<String>
is unchecked... really, you could just use anArrayAdapter
as Merrill did, but that just exchanges one warning for another.If the warning causes issue, just add
to the method signature or above the statement.
我在 Spinners 中保留了一个单独的 ArrayList,其中包含所有项目。这样我可以在 ArrayList 上执行 indexOf 操作,然后使用该值在 Spinner 中设置选择。
I keep a separate ArrayList of all the items in my Spinners. This way I can do indexOf on the ArrayList and then use that value to set the selection in the Spinner.
如果您使用字符串数组,这是最好的方法:
if you are using string array this is the best way:
使用以下行选择使用值:
Use following line to select using value:
你也可以用这个,
You can use this also,
如果您需要在任何旧适配器上有一个 indexOf 方法(并且您不知道底层实现),那么您可以使用以下方法:
If you need to have an indexOf method on any old Adapter (and you don't know the underlying implementation) then you can use this:
基于美林的回答
这是如何使用 CursorAdapter
Based on Merrill's answer
here is how to do with a CursorAdapter
你可以使用这种方式,只是让你的代码更简单、更清晰。
希望有帮助。
You can use this way, just make your code more simple and more clear.
Hope it helps.
这是我的解决方案
和下面的 getItemIndexById
希望有帮助!
here is my solution
and getItemIndexById below
Hope this help!
我正在使用自定义适配器,因为此代码就足够了:
因此,您的代码片段将如下所示:
I am using a custom adapter, for that this code is enough:
So, your code snippet will be like this:
这是我通过字符串获取索引的简单方法。
This is my simple method to get the index by string.
假设您需要从资源中的字符串数组填充微调器,并且您希望保持从服务器选择的值。
因此,这是在微调器中设置从服务器选择的值的一种方法。
希望有帮助!
PS 代码是 Kotlin 语言!
Suppose you need to fill the spinner from the string-array from the resource, and you want to keep selected the value from server.
So, this is one way to set selected a value from server in the spinner.
Hope it helps!
P.S. the code is in Kotlin!
如果您使用的是
SimpleCursorAdapter
(其中columnName
是您用来填充spinner
的数据库列的名称),请按以下步骤操作):另外(Akhil 的答案的改进)如果您从大批:
Here is how to do it if you are using a
SimpleCursorAdapter
(wherecolumnName
is the name of the db column that you used to populate yourspinner
):Also (a refinement of Akhil's answer) this is the corresponding way to do it if you are filling your Spinner from an array:
要使应用程序记住最后选择的微调器值,您可以使用以下代码:
下面的代码读取微调器值并相应地设置微调器位置。
并将下面的代码放在您知道存在最新微调器值的位置,或者根据需要放在其他位置。
这段代码基本上将 Spinner 值写入 SharedPreferences 中。
To make the application remember the last selected spinner values, you can use below code:
Below code reads the spinner value and sets the spinner position accordingly.
And put below code where you know latest spinner values are present, or somewhere else as required.
This piece of code basically writes the spinner value in SharedPreferences.
如果您将 XML 数组设置为 XML 布局中的微调器,则可以执行此操作
If you set an XML array to the spinner in the XML layout you can do this
实际上有一种方法可以使用 AdapterArray 上的索引搜索来获取此信息,并且所有这些都可以通过反射来完成。我什至更进一步,因为我有 10 个 Spinner,并且想要从我的数据库动态设置它们,并且数据库仅保存值而不是文本,因为 Spinner 实际上每周都会变化,因此该值是我在数据库中的 ID 号。
只要字段位于对象的顶层,您就可以在几乎任何列表上使用以下索引搜索。
这里可以为所有基元创建 Cast 方法,其中一种是针对 string 和 int 的。
There is actually a way to get this using an index search on the AdapterArray and all this can be done with reflection. I even went one step further as I had 10 Spinners and wanted to set them dynamically from my database and the database holds the value only not the text as the Spinner actually changes week to week so the value is my id number from the database.
Here is the indexed search you can use on almost any list as long as the fields are on top level of object.
Cast method which can be create for all primitives here is one for string and int.
当尝试在使用光标加载器填充的微调器中选择正确的项目时,我遇到了同样的问题。我首先从表 1 中检索了要选择的项目的 ID,然后使用 CursorLoader 填充微调器。在 onLoadFinished 中,我循环遍历填充微调器适配器的光标,直到找到与我已有的 id 匹配的项目。然后将光标的行号分配给微调器的选定位置。当在包含保存的微调器结果的表单上填充详细信息时,最好有一个类似的函数来传递您希望在微调器中选择的值的 id。
I had the same issue when trying to select the correct item in a spinner populated using a cursorLoader. I retrieved the id of the item I wanted to select first from table 1 and then used a CursorLoader to populate the spinner. In the onLoadFinished I cycled through the cursor populating the spinner's adapter until I found the item that matched the id I already had. Then assigned the row number of the cursor to the spinner's selected position. It would be nice to have a similar function to pass in the id of the value you wish to select in the spinner when populating details on a form containing saved spinner results.
由于之前的一些答案非常正确,我只是想确保你们中没有人遇到这样的问题。
如果使用
String.format
将值设置为ArrayList
,则必须使用相同的字符串结构String.format
获取值的位置。示例:
您必须像这样获取所需值的位置:
否则,您将得到
-1
,项目未找到!由于阿拉伯语言,我使用了
Locale.getDefault()
。我希望这对你有帮助。
As some of the previous answers are very right, I just want to make sure from none of you fall in such this problem.
If you set the values to the
ArrayList
usingString.format
, you MUST get the position of the value using the same string structureString.format
.An example:
You must get the position of needed value like this:
Otherwise, you'll get the
-1
, item not found!I used
Locale.getDefault()
because of Arabic language.I hope that will be helpful for you.
这是我希望完整的解决方案。我有以下枚举:
在以下类
代码中使用,通过 HTTPMethod 枚举成员设置微调器:
其中
R.id.spinnerHttpmethod
在布局文件中定义,并且android.R.layout .simple_spinner_item
由 android-studio 提供。Here is my hopefully complete solution. I have following enum:
used in following class
Code to set the spinner by HTTPMethod enum-member:
Where
R.id.spinnerHttpmethod
is defined in a layout-file, andandroid.R.layout.simple_spinner_item
is delivered by android-studio.非常简单,只需使用
getSelectedItem();
例如:
上面的方法返回一个字符串值,
上面的
R.array.admin_type
是一个字符串资源文件,其中的值只需创建一个.xml 文件中的值>>字符串
very simple just use
getSelectedItem();
eg :
the above method returns an string value
in the above the
R.array.admin_type
is an string resource file in valuesjust create an .xml file in values>>strings
由于我需要一些也适用于本地化的东西,所以我想出了这两种方法:
如您所见,我还偶然发现了数组之间区分大小写的额外复杂性。 xml 和我正在比较的
value
。如果没有这个,上面的方法可以简化为:
return arrayValues.indexOf(value);
静态辅助方法
Since I needed something, that also works with Localization, I came up with these two methods:
As you can see, I also stumbled over additional complexity of case sensitivity between arrays.xml and the
value
I am comparing against.If you don't have this, the above method can be simplified to something like:
return arrayValues.indexOf(value);
Static helper method
您必须通过具有类似 REPEAT[position] 的位置的自定义适配器。并且它工作正常。
you have to pass your custom adapter with position like REPEAT[position]. and it works properly.