首页

Spinner控件

搜索

概述

Spinner是显示列表框的控件。Spinner是AdapterView的间接子类,因此该控件可以通过适配器对象来显示数据。如图-4所示,Spinner也是ViewGroup类的间接子类,所以它也是个容器型的View,即该View的每个列表项可以用布局来设置,布局中可以包含若干控件。

图-4是Spinner的一个应用界面,当单击图-4a中的红框的控件时,将弹出图-4b所示的列表。

图-4a 图-4b

常用属性

prompt

列表框选项的提示

entries

使用数组资源设置下拉列表框的内容

常用方法

1、setOnItemSelectedListener(OnItemSelectedListener listener);

作用:Spinner列表项选择发生改变的响应事件,参数是OnItemSelectedListener接口的一个实例。

说明:OnItemSelectedListener接口,负责监听列表项发生改变的事件,该接口中定义了两个方法:

(1)void onItemSelected(AdapterView<?> parent, View view, int position,long id)

第一个参数-parent:列表对象;

第二个参数-view:列表项对象;

第三个参数-position:列表项在列表中的位置的索引值,位置值从0开始计算。

第四个参数-id:列表项在列表中的行的索引值。一般情况,第三、第四个参数的值是一致的。

(2)void onNothingSelected(AdapterView<?> parent)

作用:未发生选择时,触发本方法。

参数-parent:当前列表对象。

2、void setDropDownViewResource(int resource)

作用:设置下拉选框的布局,Android为下拉选框提供默认的布局,也可根据业务需求自定义布局。

说明:参数-resource:布局的资源索引值。

【示例】

示例1-Spinner控件与数组的绑定

显示如图-4的存放年份的列表,当用户选择其中某个年份后,显示该年是闰年,还是平年。

步骤1、在res/values文件夹下创建arrays.xml,在该文件中定义一个存放年份的字符串数组,代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<resources>

<string-array name="years">

<item>1998</item>

<item>1999</item>

<item>2000</item>

<item>2001</item>

<item>2002</item>

</string-array>

</resources>

步骤2、打开res/layout/main.xml,在该文件中定义Spinner控件,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

<Spinner 

android:id="@+id/spinner"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:entries="@array/years"/>

</LinearLayout>

步骤3、打开MainAct.java,在该类显示图-4的界面并实现对闰、平年的判断。代码如下所示:

//本类实现了OnItemSelectedListener接口

public class MainAct extends Activity implements OnItemSelectedListener{

String[] mYears;

Spinner mSpinner;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        //从资源中获取年份的数组

        mYears=getResources().getStringArray(R.array.years);

        //创建列表框控件

        mSpinner=(Spinner)findViewById(R.id.spinner);

        //注册列表项改变的事件

        mSpinner.setOnItemSelectedListener(this);

    }

    //实现列表项改变的事件

@Override

public void onItemSelected(AdapterView<?> parent, View view, int position,

long id) {

//将字符串转换为整数

int year=Integer.parseInt(mYears[position]);

//判断闰年

if(year%400==0 || year%4==0&&year%100!=0){

Toast.makeText(this, "闰年", 3000).show();

}else{

Toast.makeText(this, "平年", 3000).show();

}

}

//实现列表项未发生改变的事件,此方法目前没有具体的实现代码

@Override

public void onNothingSelected(AdapterView<?> parent) {

}

}

示例2-Spinner控件与适配器绑定

在上例基础上,显示两个列表框,如图-5所示,一个存放年份,一个存放月份。当选择了某年某月时,在下边显示该年该月的天数,要求:考虑闰年2月和平年2月的情况。

图-5

步骤1、在res/values文件夹下创建arrays.xml文件,该文件中定义两个数组,分别存放年份和月份,代码如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<resources>

<string-array name="years">

<item>1998</item>

<item>1999</item>

<item>2000</item>

<item>2001</item>

<item>2002</item>

</string-array>

<string-array name="months">

<item>1</item>

<item>2</item>

<item>3</item>

<item>4</item>

<item>5</item>

<item>6</item>

<item>7</item>

<item>8</item>

<item>9</item>

<item>10</item>

<item>11</item>

<item>12</item>

</string-array>

</resources>

步骤2、在res/layout/main.xml文件中定义Spinner控件,代码与示例1的步骤2基本相同,但要去掉与数组绑定的属性,即去掉这行代码:android:entries="@array/years"

步骤3、在Activity类中编写如下代码,实现显示某年某月天数的功能:

//本类实现了OnItemSelectedListener接口

public class MainAct extends Activity implements OnItemSelectedListener{

    int mYear=1998;//存放当前被选择的年份,默认值为1998

    int mMonth=1;//当前被选择的月份,默认值1

    String[] mYears,mMonths;//存放所有年份、月份的数组

    //存放月份天数的数组,下标表示月份,数组元素值是下标所在月的天数

    int[] mDays={29,31,28,31,30,31,30,31,31,30,31,30,31};

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        //创建用于选择年份的Spinner控件

        Spinner spinYears=(Spinner)findViewById(R.id.spinYear);

        //创建数组适配器对象

        ArrayAdapter<CharSequence> adapterYears=ArrayAdapter.createFromResource(

         this, R.array.years, android.R.layout.simple_spinner_item);

        //设置下拉列表的布局

        adapterYears.setDropDownViewResource(

         android.R.layout.simple_spinner_dropdown_item);

        spinYears.setAdapter(adapterYears);//控件与适配器相关联 

        //创建用于选择月份的Spinner控件

        Spinner spinMonths=(Spinner)findViewById(R.id.spinMonth);

        ArrayAdapter<CharSequence> adapterMonths=ArrayAdapter.createFromResource(

         this, R.array.months, android.R.layout.simple_spinner_item);

        adapterMonths.setDropDownViewResource(

         android.R.layout.simple_spinner_dropdown_item);

        spinMonths.setAdapter(adapterMonths);//控件与适配器相关联 

        //注册spinMonths的列表选择改变的事件

        spinMonths.setOnItemSelectedListener(this);

      //注册spinYears的列表选择改变的事件

        spinYears.setOnItemSelectedListener(this);

        //从资源中获取年份和月份的数组

        mYears=getResources().getStringArray(R.array.years);

        mMonths=getResources().getStringArray(R.array.months);

    }

    //实现列表项发生改变的事件

@Override

public void onItemSelected(AdapterView<?> parent, View view, int position,

long id) {

switch(parent.getId()){//判断是哪个控件

case R.id.spinYear://若是选择年份的下拉列表控件

//获得年份值

mYear=Integer.parseInt(mYears[position]);

//若是闰年的2月份

if(mMonth==2&&(mYear%400==0 || mYear%4==0&&mYear%100!=0)){

Toast.makeText(this, mDays[0]+"天", 3000).show();

}else{

Toast.makeText(this, mDays[mMonth]+"天", 3000).show();

}

break;

case R.id.spinMonth://若是月份的下拉选框

//获取月份被选择的月份值

mMonth=Integer.parseInt(mMonths[position]);

//以下判断显示某年某月的代码未给出,请仿照选择年份的下拉选框的代码自己实现

break;

}

}

@Override

public void onNothingSelected(AdapterView<?> parent) {

}

}

说明:

与Spinner绑定的ArrayAdapter要用以下方式创建:

ArrayAdapter<CharSequence> adapterMonths=ArrayAdapter.createFromResource(

         this, R.array.months, android.R.layout.simple_spinner_item);

其中:

第一个参数是上下文对象

第二个参数是下拉列表中显示的数据(以上是字符串数组)

第三个参数是下拉列表的布局,以上用的是Android框架提供的布局。

Spinner控件与ListView的区别

Spinner与ListView都是ApterView的间接子类,都是适配器类型的控件,并且都是容器类型,其不同的地方在布局的xml设置上:

   1、下拉列表的标题

      android:prompt="@string/spinner_1_color_prompt"

   2、创建ArrayAdapter的方式不同

      ArrayAdapter.createFromResource(this, R.array.color, //放的是数据的索引值

          android.R.layout.simple_spinner_item);

   3、在适配器对象中设置弹出单选列表的布局

      adapter.setDropDownViewResource(

android.R.layout.simple_spinner_dropdown_item);   

notifyDataSetChanged()方法

概述

当ListView中的数据发生改变后,通过notifyDataSetChange()方法可通知适配器对象数据发生改变。

操作步骤

步骤1、修改ListView中的数据。

步骤2、调用notifyDataSetChange(adapter)设置适配器对象数据发生了改变。

步骤3、调用setAdapter重新将ListView对象与适配器对象关联。

示例

mCitys[0]="广州";//将数组的首个元素的值改为“广州”

mAdapter.notifyDataSetChanged();//通知适配器数据改变

mLvCity.setAdapter(mAdapter);//重新关联适配器与列表

 

 

上一页 下一页