在Android中为Spinner的Array Adapter添加枚举

时间:2011-08-24 22:00:53

标签: android enums android-widget

我正在寻找使用enums作为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()));

这几乎可行,但在我的微调器列表中,我最终得到的是缩写,而不是州名(这就是我想要的)。有没有解决方法来正确设置此设置?

5 个答案:

答案 0 :(得分:35)

我希望这有助于某人。我花了一段时间才弄清楚自己。诀窍是在你的枚举中覆盖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();

答案 1 :(得分:1)

让我们试着借助一个例子来提供答案

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);

答案 2 :(得分:1)

这里是如何使用 Kotlin 和 Material TextInputLayout 来做它,它可以用作 Spinner 替换,首先像这个答案中描述的那样实现它:https://stackoverflow.com/a/57746352/2472350

首先像这样定义枚举:

Sim_long1$Categories <- gsub('\\.*C*','', Sim_long1$Categories)

然后像这样设置一个适配器:

enum class States(val label: String) {
    AL("Alabama"), 
    AK("Alaska"), 
    AR("Arkansas"), 
    AZ("Arizona"), 
    CA("California"), 
    CO("Colorado"),;

    override fun toString(): String {
        return label
    }
}

spinner_item_tv 可以是任何 TextView,如下所示:

val items = OrderStatusType.values()
val adapter = ArrayAdapter(requireContext(), R.layout.spinner_item_tv, items)
autoCompleteTextView.setAdapter(adapter)

获取所选项目:

<?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_width="match_parent"
    android:layout_height="wrap_content"
    tools:text="@tools:sample/cities" />

您还可以通过像这样搜索枚举来找到枚举值:

val selectedState = autoCompleteTextView.text.toString()

答案 3 :(得分:0)

添加一个像这样的枚举构造函数...然后用States.fullName()替换States.values()

public enum States{

    AL("Alabama"), 
    AK("Alaska"), 
    ... (etc.)

    private String fullName;

    States(String fullName) {
        this.fullName = fullName;
    }

    public String fullName()   { return fullName; }
}

答案 4 :(得分:0)

也许您可以尝试覆盖toString()函数,如here 所示。我还没有尝试过,但我刚要去。