在 Android 中为 Spinner 的数组适配器添加枚举
Posted
技术标签:
【中文标题】在 Android 中为 Spinner 的数组适配器添加枚举【英文标题】:Adding Enums to Array Adapter for Spinner in Android 【发布时间】:2011-11-03 05:08:32 【问题描述】:我希望将枚举用于 android 上的微调器小部件内的列表。我的枚举设置如下:
public enum States
AL("Alabama"),
AK("Alaska"),
AR("Arkansas"),
AZ("Arizona"),
CA("California"),
CO("Colorado"),
... (etc.)
我当前的阵列适配器设置如下:
mAddressState.setAdapter(new ArrayAdapter<States>(this, android.R.layout.simple_list_item_1, States.values()));
这几乎可行,但在我的微调器列表中,我最终得到的是缩写,而不是州名(这是我想要的)。是否有解决方法来正确设置此设置?
【问题讨论】:
【参考方案1】:我希望这对某人有所帮助。我花了一段时间才自己弄清楚。诀窍是在您的枚举中覆盖 toString 。您的状态枚举的代码是:
public enum States
AL("Alabama"),
AK("Alaska"),
AR("Arkansas"),
AZ("Arizona"),
CA("California"),
CO("Colorado"),
... (etc.);
private String theState;
States(String aState)
theState = aState;
@Override public String toString()
return theState;
然后,像你一样创建适配器:
mAddressState.setAdapter(new ArrayAdapter<States>(this,
android.R.layout.simple_list_item_1, States.values()));
长名称将显示在微调器中。要从适配器获取缩写名称,例如存储选定的名称,请使用 enum.name() 函数。例如:
Spinner spinner = (Spinner) myView.findViewById(R.id.theState);
String selected = ((States)spinner.getSelectedItem()).name();
【讨论】:
【参考方案2】:让我们试着通过一个例子来提供答案
public enum Day SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
考虑上面的枚举。现在您可以通过以下方式将其添加到适配器:
方法一:
ArrayAdapter<Day> adapter = new ArrayAdapter<Day>(activity, android.R.layout.simple_spinner_dropdown_item, Day.values());
注意:您可以覆盖枚举定义中的 toString 方法,以在高级枚举的情况下显示所需的值。
方法二:
public static final List<String> daysList = Stream.of(Day.values()).map(Day::name).collect(Collectors.toList());
ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity, android.R.layout.simple_spinner_dropdown_item, daysList);
【讨论】:
【参考方案3】:这里是如何使用 Kotlin 和 Material TextInputLayout 来实现它,它可以用作 Spinner 的替代品,首先像这个答案中描述的那样实现它:https://***.com/a/57746352/2472350
首先像这样定义枚举:
enum class States(val label: String)
AL("Alabama"),
AK("Alaska"),
AR("Arkansas"),
AZ("Arizona"),
CA("California"),
CO("Colorado"),;
override fun toString(): String
return label
然后像这样设置一个适配器:
val items = OrderStatusType.values()
val adapter = ArrayAdapter(requireContext(), R.layout.spinner_item_tv, items)
autoCompleteTextView.setAdapter(adapter)
spinner_item_tv 可以是任何 TextView,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/spinner_item_tv"
android:layout_
android:layout_
tools:text="@tools:sample/cities" />
获取选中项:
val selectedState = autoCompleteTextView.text.toString()
你也可以像这样搜索枚举值:
val selectedState = States.values().firstOrNull it.label == autoCompleteTextView.text.toString()
// could be null if nothing is selected
【讨论】:
【参考方案4】:像这样添加一个枚举构造函数...然后将 States.values() 替换为 States.fullName()
public enum States
AL("Alabama"),
AK("Alaska"),
... (etc.)
private String fullName;
States(String fullName)
this.fullName = fullName;
public String fullName() return fullName;
【讨论】:
那行不通。我实际上已经这样做了,但没有具体说明,抱歉。阵列适配器似乎不喜欢我尝试这样做。 mAddressState.setAdapter(new ArrayAdapter也许您可以尝试重写 toString() 函数,如here 所示。我还没有尝试过,但我正要尝试。
【讨论】:
以上是关于在 Android 中为 Spinner 的数组适配器添加枚举的主要内容,如果未能解决你的问题,请参考以下文章
android Spinner:在 onItemSelected 视图中为空
在 Android 中为 Spinner 创建文本过滤器(如快速搜索)