【问题标题】:Android create a spinner with items that have a hidden value and display some text?Android使用具有隐藏值的项目创建一个微调器并显示一些文本?
【发布时间】:2012-07-05 19:30:15
【问题描述】:

我敢肯定这被问了很多,我在这里发现了一些类似的问题,但没有一个真正让我失望。我希望有人可以帮助我。

我想要做的是向用户展示一个下拉菜单(微调器),其中包含香草、巧克力、草莓口味的列表。

当用户选择他们选择的口味时,我希望返回草莓的值为 10。

Strawberry = 10
Chocolate = 20
Vanilla = 30

我来自 vb.net 背景,所以发现这非常难以处理,因为我需要阵列适配器和其他东西才能做到这一点?

谁能为我简化一些事情并分享一些代码?

【问题讨论】:

    标签: android


    【解决方案1】:

    你可以试试这个

    ArrayAdapter<String> SpinerAdapter;
             String[] arrayItems = {"Strawberry","Chocolate","Vanilla"};
             final int[] actualValues={10,20,30}; 
    
            SpinerAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_dropdown_item, arrayItems);
            spinner.setAdapter(SpinerAdapter);
    
            spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    
                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {
                    int thePrice=actualValues[ arg2];
    
                }
    
                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub
    
                }
            });
    

    【讨论】:

      【解决方案2】:

      代码如下:

              TextView textView=(TextView) findViewById(R.id.textView1);
              Spinner spinner=(Spinner) findViewById(R.id.spinner1);
              spinner.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item,quantity));
              spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
      
                  public void onItemSelected(AdapterView<?> arg0, View arg1,
                          int arg2, long arg3) {
                      if(arg2==0){
                      textView.setText("Strawberry = 10");
                  }else if(arg2==1){
                      textView.setText("Chocolate = 20");
                  }else if(arg2==2){
                      textView.setText("Vanilla = 30");
                  }
      
                  }
      
                  public void onNothingSelected(AdapterView<?> arg0) {
      
                  }
              });
      
      String[] quantity={"Strawberry","Chocolate","Vanilla"};
      

      和xml文件:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >
      
      
          <Spinner
              android:id="@+id/spinner1"
              android:layout_width="match_parent"
              android:layout_height="wrap_content" />
      
          <TextView
              android:id="@+id/textView1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
               />
      
      </LinearLayout>
      

      【讨论】:

        【解决方案3】:

        我认为这篇文章会对你有所帮助Android: How to bind spinner to custom object list?

        这个问题作者的要求和你一样

        【讨论】:

        • 感谢那里发布的解决方案看起来很完美!
        • @L2wi 很高兴它对您有所帮助。您能否将其标记为答案,以便对其他人也有帮助
        • 绝对!我还没有真正实现它,但我想我会感谢你的链接。
        【解决方案4】:

        使用 Enums 将所有内容整齐地包装起来。

        使用 Enums 可以保持整洁,并为您提供面向对象的接口,而无需保留数据。从外观上看,您正在为每个“口味”使用常量值(例如Strawberry = 10)。

        因此,首先创建一个名为enums 的“包”或目录。我们会将您的所有Enums 保留在那里。

        然后在那里创建一个名为Flavour的新文件:

        枚举/Flavour.java

        public enum Flavour {
        
            STRAWBERRY("Strawberry", 10),
            CHOCOLATE("Chocolate", 20),
            VANILLA("Vanilla", 30);
        
            private String displayString;
            private int value;
        
            private Flavour ( String displayString, int value) {
                this.displayString = displayString;
                this.value   = value;
            }
        
            @Override
            public String toString() {
                return displayString;
            }
        
            public String displayString() { return displayString; }
        
            public String value() { return value; }
        
            public static Flavour fromDisplayString( String displayString) {
        
                if ( displayString != null ) {
                    for ( Flavour flavour : Flavour.values() ) {
                        if ( displayString.equalsIgnoreCase( flavour.displayString ) ) {
                            return flavour;
                        }
                    }
                }
        
                throw new IllegalArgumentException("No Flavour with display string " + displayString + " found");
        
            }
        
            public static Flavour fromValue( int value) {
                if (value != null) {
                    for (Flavour flavour : Flavour.values()) {
                        if (value.equals(flavour.value)) {
                            return flavour;
                        }
                    }
                }
        
                throw new IllegalArgumentException("No Flavour with value " + value + " found");
            }
        
        }
        

        适配器的其余部分由您完成,但关键部分如下:

        • 使用 Flavour.values() 获取 Spinner 适配器的 Flavors 数组。

        • 当 Spinner 被填充时,toString() 将被自动调用,因此您的显示字符串(或您在该方法中返回的任何内容)将成为显示的内容。

        • 保存值时,可以这样使用:

          ( (Flavour) spinner.getSelectedItem() ).value();
          

        【讨论】:

          【解决方案5】:

          您可以实例化使用您的数据对象类型键入的 ArrayAdapter。 然后 Spinner 将保存您的完整数据对象而不是字符串。 显示的值将由数据对象的 toString() 方法确定。

          例子:

          List<Project> allProjects = ...;
          
              ArrayAdapter<Project> spinnerAdapter = new ArrayAdapter<Project>(this, android.R.layout.simple_spinner_item,allProjects.toArray(new Project[allProjects.size()]));
              spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
              spinner.setAdapter(spinnerAdapter);
              spinner.setOnItemSelectedListener(this);
          

          ...

          @Override
          public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
              Log.i(AppConst.TAG, "ItemSelected:" + position + " id: " + id);
              Project selectedProject = (Project)getSpinner().getSelectedItem();
              currentTask = selectedProject.toString();
              Log.i(AppConst.TAG, "Selected Project:" + selectedProject.getId());
              ...
          }
          

          【讨论】:

          • 这是一个很棒的提示!谢谢。我能够在我的自定义类中简单地覆盖 toString() 并获取值以准确显示我想要的内容。
          猜你喜欢
          • 2020-03-21
          • 2021-10-02
          • 1970-01-01
          • 2017-04-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多