Spinner的深入学习

简介:

  spinner是一个列表选择框,会在用户选择后,展示一个列表供用户进行选择。Spinner是ViewGroup的间接子类,它和其他的Android控件一样,数据需要使用Adapter进行封装。

  下面介绍一下Spinner的常用XML属性,Android也为其属性提供了相应的getter、setter方法:

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

  作为一个列表选择控件,Spinner具有一些选中选项可以触发的事件,但它本身没有定义这些事件,均继承自间接父类AdapterView。Spinner支持的几个常用事件有以下几个:

  • AdapterView.OnItemCLickListener:列表项被点击时触发。
  • AdapterView.OnItemLongClickListener:列表项被长按时触发。
  • AdapterView.OnItemSelectedListener:列表项被选择时触发。

  PS:因为适配器可以设置各种不同的样式,有选择、单选、多选,所以OnItemCLickListener和OnItemSelectedListener是适用于不同场景的。

数据绑定:

 对于Spinner展示的数据源,一般使用两种方式设定数据:

  • 通过XML资源文件设置,这种方式比较死板,但是如果仅仅需要展示固定的、简单的数据,这种方式还是可以考虑的,比较直观。
  • 使用Adapter接口设置,这是最常见的方式,动态、灵活,可以设定各种样式以及数据来源。

  先来讲讲通过XML资源文件设置Spinner数据的方式,首先需要在/res/values目录下新建XML格式的资源文件,名字不重要,但是一般会使用strings.xml。在其中的<resourse.../>标签下,定义<string-array.../>标签,通过它中的<item.../>标签来设置选择数据。

  XML文件结构:

  <resource>

    <string-array name="arrayname">

      <item>item1</item>

      <item>item2</item>

      <item>item3</item>

    </string-array>

  <resource>

布局代码:

 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <TextView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:text="弹出的Spinner" />
11 
12     <Spinner
13         android:id="@+id/spinnerBase"
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:spinnerMode="dialog" />
17 
18     <TextView
19         android:layout_width="wrap_content"
20         android:layout_height="wrap_content"
21         android:text="下拉的Spinner(默认)" />
22 
23     <Spinner
24         android:id="@+id/spinnerBase1"
25         android:layout_width="match_parent"
26         android:layout_height="wrap_content"
27         android:spinnerMode="dropdown" />
28 
29     <TextView
30         android:layout_width="wrap_content"
31         android:layout_height="wrap_content"
32         android:text="entries绑定数据源" />
33 
34     <Spinner
35         android:id="@+id/spinnerBase2"
36         android:layout_width="match_parent"
37         android:layout_height="wrap_content"
38         android:entries="@array/beijing" />
39 
40     <TextView
41         android:layout_width="wrap_content"
42         android:layout_height="wrap_content"
43         android:text="弹出带标题的Dialog,并且使用entries绑定数据源" />
44 
45     <Spinner
46         android:id="@+id/spinnerBase3"
47         android:layout_width="match_parent"
48         android:layout_height="wrap_content"
49         android:entries="@array/beijing"
50         android:prompt="@string/beij_prompt"
51         android:spinnerMode="dialog" />
52 
53 </LinearLayout>

List数据:
<?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3     <string name="app_name">SpinnerDemo</string>
 4     <string name="action_settings">Settings</string>
 5     <string name="hello_world">Hello world!</string>
 6     <string name="beij_prompt">北京区域</string> 
 7     <string-array name="beijing">
 8         <item>朝阳区</item>
 9         <item>海淀区</item>
10         <item>房山区</item>
11         <item>丰台区</item>
12         <item>东城区</item>
13         <item>西城区</item>
14     </string-array>    
15 </resources>


主代码:
1 package com.bgxt.datatimepickerdemo;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import android.app.Activity;
 7 import android.os.Bundle;
 8 import android.view.View;
 9 import android.widget.AdapterView;
10 import android.widget.AdapterView.OnItemSelectedListener;
11 import android.widget.ArrayAdapter;
12 import android.widget.Spinner;
13 import android.widget.Toast;
14 
15 public class SpinnerBaseActivity extends Activity {
16     private Spinner spinner1, spinner2;
17 
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_spinnerbase);
22 
23         spinner1 = (Spinner) findViewById(R.id.spinnerBase);
24         spinner2 = (Spinner) findViewById(R.id.spinnerBase1);
25         // 声明一个ArrayAdapter用于存放简单数据
26         ArrayAdapter<String> adapter = new ArrayAdapter<String>(
27                 SpinnerBaseActivity.this, android.R.layout.simple_spinner_item,
28                 getData());
29         // 把定义好的Adapter设定到spinner中
30         spinner1.setAdapter(adapter);
31         spinner2.setAdapter(adapter);
32         // 为第一个Spinner设定选中事件
33         spinner1.setOnItemSelectedListener(new OnItemSelectedListener() {
34 
35             @Override
36             public void onItemSelected(AdapterView<?> parent, View view,
37                     int position, long id) {
38                 // 在选中之后触发
39                 Toast.makeText(SpinnerBaseActivity.this,
40                         parent.getItemAtPosition(position).toString(),
41                         Toast.LENGTH_SHORT).show();
42             }
43 
44             @Override
45             public void onNothingSelected(AdapterView<?> parent) {
46                 // 这个一直没有触发,我也不知道什么时候被触发。
47                 //在官方的文档上说明,为back的时候触发,但是无效,可能需要特定的场景
48             }
49         });
50 
51     }
52 
53     private List<String> getData() {
54         // 数据源
55         List<String> dataList = new ArrayList<String>();
56         dataList.add("北京");
57         dataList.add("上海");
58         dataList.add("南京");
59         dataList.add("宜昌");
60         return dataList;
61     }
62 
63 }

spinner

spinner


posted @ 2015-11-03 16:00  冷月舞痕  阅读(322)  评论(0编辑  收藏  举报