【问题标题】:Adding Enums to Array Adapter for Spinner in Android在 Android 中为 Spinner 的数组适配器添加枚举
【发布时间】: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()));

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

【问题讨论】:

    标签: android enums android-widget


    【解决方案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://stackoverflow.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_width="match_parent"
            android:layout_height="wrap_content"
            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(this, android.R.layout.simple_list_item_1, States.getStateName()));我还尝试将数组适配器类型设置为 new ArrayAdapter 仍然没有做我想要的。还有其他建议吗?
          【解决方案5】:

          也许您可以尝试重写 toString() 函数,如here 所示。我还没有尝试过,但我正要尝试。

          【讨论】:

            猜你喜欢
            • 2015-06-07
            • 1970-01-01
            • 1970-01-01
            • 2011-05-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-07
            相关资源
            最近更新 更多