【问题标题】:Android Bind Spinner to ClassAndroid 将 Spinner 绑定到类
【发布时间】:2011-09-01 14:18:32
【问题描述】:

我在使用 Spinner 小部件时遇到了一些问题。给定以下代码:

    ArrayList<Person> people= new ArrayList<Person>();

    Person = null;
    for(int i = 0; i!= 10; i++) {
        p = new Person();
        s.setID(i);
        s.setName("Name " + i);
        people.add(s);
    }

我正在使用以下代码将其绑定到 Spinner:

 Spinner spinner1 = (Spinner) findViewById  (R.id.spinner);       
 ArrayAdapter<Person> adapter = new ArrayAdapter<Person>(this, android.R.layout.simple_spinner_item, people);                           
 spinner1.setAdapter(adapter);  

我想要的是将值(id)隐藏但在选择时传递,并显示名称。任何帮助表示赞赏。

谢谢。

【问题讨论】:

    标签: android spinner


    【解决方案1】:

    如果我正确理解您的问题,您希望该名称出现在微调器下拉视图中。选择项目后,您想返回 id。

    有两种方法可以解决这个问题。

    最简单的方法是实现一个 toString(),它返回 Person 对象中的名称。将对象的文本值绑定到下拉视图时,ArrayAdapter 将返回此值。 然后在您的活动中,您可以为 Spinner 设置 onItemClickListener 并调用 adapter.getItemAtPosition(position) 以检索 Person 对象。从那个人对象你可以得到你的ID。

    第二种方法是扩展 ArrayAdapter 并实现 getView 和 getDropDownView 和 getItem 方法。 getView 负责创建您在单击微调器时看到的行。 getDropDownView 负责创建您在微调器中看到的视图。并且 getItem 方法将返回对象,或者在您的情况下返回该指定位置的 id。您应该在 getView 和 getDropDownView 方法中将 Person 元素的名称绑定到 textview。创建自定义 ArrayAdapter 后,您应该为 Spinner 设置 onItemClicKListener 并按照我上面提到的那样处理它。

    第一种方法很简单,但第二种方法要优越得多,并且可以更好地控制您的适配器,尤其是当您开始开发更复杂的东西时。

    希望对您有所帮助。

    【讨论】:

    • 我明白了这个理论,但我在实施时遇到了麻烦。你有任何代码可以帮助我吗?
    • 我真的很喜欢第一种方法。它几乎散发出 .NET 中数据绑定的味道——利用 WPF 和 Silverlight 中的 MVVM。在这种情况下,您巧妙地公开了您希望在 toString() 实现中显示的一个属性,但在 ArrayAdapter 中维护完整对象以供以后处理……我认为这是关键。无需维护和同步两个 ArrayList...
    【解决方案2】:

    非常老的帖子——只是偶然发现了一些别的东西——发现了一个错误(可能只是疏忽)

    jagsund 基本上是对的,接受,他对 getView 和 GetDropDownView 的定义是错误的——实际上与他所说的相反:getView 显示微调器控件内的内容,getDropDownView 创建您单击时看到的视图行微调器。

    因此,除非您单击微调器,否则 getDropDownView 甚至不会被调用 - 如果您覆盖 ArrayAdapter,您会看到这一点

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2018-01-15
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多