Android 列表选择框 Spinner

Spinner 是 Android 的列表选择框,不过 spinner 并不需要显示下拉列表,而是相当于弹出一个菜单供用户选择。

一、Spinner 属性


属性 描述
android:spinnerMode 列表显示的模式,有两个选择,为弹出列表(dialog)以及下拉列表(dropdown),如果不特别设置,为下拉列表。
android:entries 使用 <string-array.../> 资源配置数据源。
android:prompt 对当前下拉列表设置标题,仅在 dialog 模式下有效。传递一个 @string/name 资源,需要在需要在资源文件中定义 <string.../>

二、Spinner 常用事件


事件 描述
AdapterView.OnItemCLickListener 列表项被点击时触发。
AdapterView.OnItemLongClickListener 列表项被长按时触发。
AdapterView.OnItemSelectedListener 列表项被选择时触发。

三、Spinner 数据绑定


  • 使用 XML 设置数组资源,简单方便但是不灵活,如果只是显示固定的简单数据可以使用。

  • 使用 adapter 接口设置,最常见的方式,动态加载灵活,可以设置各种样式和数据来源。

XML 文件结构(一般写在string.xml文件中)

  1. <resource>
  2. <string-array name="arrayname">
  3. <item>item1</item>
  4. <item>item2</item>
  5. <item>item3</item>
  6. </string-array>
  7. <resource>

对于简单的数据可以使用 ArrayAdapter 来设置适配器,但是对于稍微复杂的数据 ArrayAdapter 就无法满足需求了,这时需要使用 SimpleAdapter 来做适配。

SimpleAdapter 适配器同样基础自 Adapter,他可以映射静态的 XML 格式的布局文件到视图中。可以指定List<Map<P,T>>格式数据,list 的数据对应 Spinner 中的每一行,Map 中的数据对应没一条数据mSpinner = (Spinner)findViewById(R.id.sp_bank);

  1. mSpinner = (Spinner)findViewById(R.id.sp_bank);
  2. banklist = (List<String>) resultMap.get("list");
  3. // 将可选内容与 ArrayAdapter 连接起来
  4. adapter = new ArrayAdapter<String>(self, R.layout.simple_spinner_item, banklist);
  5. // 设置下拉列表的风格
  6. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  7. // 将 adapter 添加到 spinner 中
  8. mSpinner.setAdapter(adapter);
  9. // 添加事件 Spinner 事件监听
  10. mSpinner.setOnItemSelectedListener(new SpinnerSelectedListener());
  1. class SpinnerSelectedListener implements OnItemSelectedListener {
  2. public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
  3. String str = parent.getItemAtPosition(position).toString();
  4. //Toast.makeText(self, "你点击的是:"+str, 2000).show();
  5. bankname = str;
  6. }
  7. public void onNothingSelected(AdapterView<?> arg0) {
  8. }
  9. }

Spinner 弹出列表事件上是 listview,所以 listview 的各种方法都可以用在 Spinner 弹出窗口这里,当时也可以自定义数据源,自定义 Adapter 继承 BaseAdapter 实现更为灵活更为复杂的效果。

Spinner 在初始化时会自动调用一次 OnItemSelectedListener 事件,这是因为系统会自动加载默认值造成的。

解决方法:手动添加默认值,这里需要主要调用顺序,必须在注册方法之前调用。

  1. // 在事件注册之前调用,一般指定第 0 个为默认值
  2. spinner.setSelection(0, true);

(完)