天天看点

【Android】 Android中spinner下拉列表的使用

     今天学习了spinner组件,使用spinner相当于从下拉列表中选择项目,下面演示一下spinner的使用(分别使用arrayadapter和自定义adapter实现)

(一):使用arrayadapter进行适配数据:

   ①:首先定义一个布局文件:

<span style="font-size:16px;"><?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"  

      />  

</linearlayout></span>  

【Android】 Android中spinner下拉列表的使用

<span style="font-size:16px;">  </span>  

  【注意:】上面的spinner有两个属性1:prompt是初始的时候,spinner显示的数据,是一个引用类型   2:entries是直接在xml布局文件中绑定数据源(可以不设置,即可以在activity中动态绑定) 

         ②:建立数据源,使用数组,这些数据将会在spinner下来列表中进行显示:

【Android】 Android中spinner下拉列表的使用

<resources>  

    <string-array name="spinnername">  

        <item>北京</item>  

        <item>上海 </item>  

        <item>广州</item>  

        <item>深圳</item>  

    </string-array>  

</resources></span>  

  ③:接着在activity中加入如下的代码(使用了系统定义的下拉列表的布局文件,当然也可以自定义)

【Android】 Android中spinner下拉列表的使用

             // 初始化控件  

mspinner = (spinner) findviewbyid(r.id.spinner1);  

// 建立数据源  

string[] mitems = getresources().getstringarray(r.array.spinnername);  

// 建立adapter并且绑定数据源  

arrayadapter<string> _adapter=new arrayadapter<string>(this,android.r.layout.simple_spinner_item, mitems);  

//绑定 adapter到控件  

mspinner.setadapter(_adapter);  

以上代码初步完成,看下运行效果:

【Android】 Android中spinner下拉列表的使用
【Android】 Android中spinner下拉列表的使用
【Android】 Android中spinner下拉列表的使用

          下面是关于spinner的点击事件(效果图如上图):

【Android】 Android中spinner下拉列表的使用

     mspinner.setonitemselectedlistener(new onitemselectedlistener() {  

@override  

public void onitemselected(adapterview<?> parent, view view,  

        int position, long id) {  

    string str=parent.getitematposition(position).tostring();  

    toast.maketext(spinneractivity.this, "你点击的是:"+str, 2000).show();  

}  

public void onnothingselected(adapterview<?> parent) {  

    // todo auto-generated method stub  

);  

       (二)使用自定义的adapter(重点)

           ①:定义每一个item的布局文件

【Android】 Android中spinner下拉列表的使用

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

    android:layout_width="match_parent"  

    android:layout_height="match_parent"  

    android:orientation="horizontal" >  

    <textview  

        android:id="@+id/textview1"  

        android:layout_width="wrap_content"  

        android:drawableleft="@drawable/ic_launcher"  

        android:paddingright="8dip"  

        android:paddingtop="8dip"  

        android:text="textview"  

        android:textsize="25sp" />  

        android:id="@+id/textview2"  

        android:paddingleft="8dip"  

</linearlayout>  

        ②:建立person类:

【Android】 Android中spinner下拉列表的使用

package com.jiangqq.csdn;  

public class person {  

    private string personname;  

    private string personaddress;  

    public person(string personname, string personaddress) {  

        super();  

        this.personname = personname;  

        this.personaddress = personaddress;  

    }  

    public string getpersonname() {  

        return personname;  

    public void setpersonname(string personname) {  

    public string getpersonaddress() {  

        return personaddress;  

    public void setpersonaddress(string personaddress) {  

       ③:创建myadapter继承与baseadapter,进行适配:

【Android】 Android中spinner下拉列表的使用

import java.util.list;  

import android.content.context;  

import android.view.layoutinflater;  

import android.view.view;  

import android.view.viewgroup;  

import android.widget.baseadapter;  

import android.widget.textview;  

/** 

 * 自定义适配器类 

 * @author jiangqq  <a href=http://blog.csdn.net/jiangqq781931404></a> 

 * 

 */  

public class myadapter extends baseadapter {  

    private list<person> mlist;  

    private context mcontext;  

    public myadapter(context pcontext, list<person> plist) {  

        this.mcontext = pcontext;  

        this.mlist = plist;  

    @override  

    public int getcount() {  

        return mlist.size();  

    public object getitem(int position) {  

        return mlist.get(position);  

    public long getitemid(int position) {  

        return position;  

    /** 

     * 下面是重要代码 

     */  

    public view getview(int position, view convertview, viewgroup parent) {  

        layoutinflater _layoutinflater=layoutinflater.from(mcontext);  

        convertview=_layoutinflater.inflate(r.layout.item, null);  

        if(convertview!=null)  

        {  

            textview _textview1=(textview)convertview.findviewbyid(r.id.textview1);  

            textview _textview2=(textview)convertview.findviewbyid(r.id.textview2);  

            _textview1.settext(mlist.get(position).getpersonname());  

            _textview2.settext(mlist.get(position).getpersonaddress());  

        }  

        return convertview;  

 ④:在activity中加入如下代码:

【Android】 Android中spinner下拉列表的使用

                // 初始化控件  

   list<person>  persons=new arraylist<person>();  

persons.add(new person("张三", "上海 "));  

persons.add(new person("李四", "上海 "));  

persons.add(new person("王五", "北京" ));  

persons.add(new person("赵六", "广州 "));  

//  建立adapter绑定数据源  

myadapter _myadapter=new myadapter(this, persons);  

//绑定adapter  

mspinner.setadapter(_myadapter);  

  运行效果如下截图:

【Android】 Android中spinner下拉列表的使用
【Android】 Android中spinner下拉列表的使用

      监听事件和第一种方法相同:

方式二:

    在web开发中,html提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可。这是在web开发中一个必不可少的交互性组件,在android中的对应实现就是spinner。

    首先来看一下spinner的文档: 

【Android】 Android中spinner下拉列表的使用

java.lang.object 

   ↳ android.view.view 

   ↳ android.view.viewgroup 

   ↳ android.widget.adapterview<t extends android.widget.adapter> 

   ↳ android.widget.absspinner 

   ↳ android.widget.spinner 

    spinner的继承结构比较复杂,在继承树中有adapterview,这是比较重要的一项,因为我们就是通过adapter来为spinner设置下拉列表项的。 

    spinner的重点问题就是下拉列表项的配置,通过之前组件的了解,我们知道资源组件的配置有两种方式,一种是通过xml文件来配置,一种是通过程序来配置。而从spinner的文档中,我们可以看到,对它的配置需要使用adapter类的实现。 

    下面我们就来看看spinner的使用,在eclipse中创建spinnerdemo项目,编写代码: 

【Android】 Android中spinner下拉列表的使用

<textview  

    android:id="@+id/degreelabel"  

    android:layout_height="wrap_content"  

    android:text="请选择您的学历" />  

<spinner  

    android:id="@+id/degree"  

    android:layout_height="wrap_content" />  

    这里放置了一个空的spinner,直接运行程序,我们看到如下效果: 

【Android】 Android中spinner下拉列表的使用

    就是一个空的下拉框,什么都没有,下面我们开始向这个下拉框中设置列表项。首先我们使用xml资源文件的配置方式,在values目录下创建spinner_data.xml,并设置如下内容: 

【Android】 Android中spinner下拉列表的使用

<string-array name="degrees">  

    <item>初中及以下</item>  

    <item>高中</item>  

    <item>大学</item>  

    <item>研究生及以上</item>  

</string-array>  

    不难理解<string-array>表示字符串的数组,就是可以定义多个字符串的项目,在其中,我们仍然使用<item>来定义每一项,设置好后,将其应用到spinner中: 

【Android】 Android中spinner下拉列表的使用

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

    配置spinner组件中的entries属性即可引用我们在spinner_data.xml中定义的degrees项目组了,不难想到,它已经被注册到r.java中了。运行程序,我们得到如下显示效果: 

【Android】 Android中spinner下拉列表的使用

    这里可以看到,我们虽然设置了提示信息,但是点击下拉框后并没有出现spinner的提示,而是直接显示出了我们设置的选项,这样的显示并不是很好看,我们希望在弹出的spinner选择框上也给出提示,那么我们可以这么来设置: 

【Android】 Android中spinner下拉列表的使用

    android:entries="@array/degrees"  

    android:prompt="@string/degrees_prompt" />  

    也就是在spinner组件中加上prompt属性即可,注意这里不能直接使用文本了,而需要使用引用,那么我们在strings.xml中加入如下信息: 

【Android】 Android中spinner下拉列表的使用

<string name="degrees_prompt">您的学历是:</string>  

   我们再次运行程序,就可以看到如下的效果: 

【Android】 Android中spinner下拉列表的使用

    这次再点击spinner,弹出的下拉框中就有了提示的prompt,显示效果好了很多。 

    下面我们看看如何通过程序来控制spinner和列表项,之前说过要使用程序,就要用到adapter类,这里我们使用实现类arrayadapter来进行操作。首先我们使用arrayadapter读取xml配置文件的方式来说明: 

【Android】 Android中spinner下拉列表的使用

<string-array name="cities">  

    <item>北京</item>  

    <item>上海</item>  

    <item>大连</item>  

    我们在spinner_data.xml中再设置一组值来表示城市,有了列表项,我们还需要再创建一个spinner,那么在main.xml中,再设置一个spinner: 

【Android】 Android中spinner下拉列表的使用

    android:id="@+id/citylabel"  

    android:text="请选择您所在的城市" />  

    android:id="@+id/city"  

    那么在activity程序中,我们可以如下来编写代码: 

【Android】 Android中spinner下拉列表的使用

package org.ourpioneer;  

import android.app.activity;  

import android.os.bundle;  

import android.widget.arrayadapter;  

import android.widget.spinner;  

public class spinnerdemoactivity extends activity {  

    private spinner city = null;// 要读取的下拉列表  

    private arrayadapter<charsequence> cities = null;// 要使用的adapter  

    public void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        super.setcontentview(r.layout.main);  

        city = (spinner) super.findviewbyid(r.id.city);// 获取下拉列表  

        city.setprompt("您所在的城市是:");// 设置prompt  

        cities = arrayadapter.createfromresource(this, r.array.cities,android.r.layout.simple_spinner_item);// 实例化arrayadapter  

        city.setadapter(cities);// 设置显示信息  

    根据代码中的注释,不难理解每行代码的意思,这和在xml中配置spinner是类似的。要多说的一点就是这里我们为arrayadapter设置的泛型是charsequence,而不是直接使用string,这是出于以后对stringbuffer的兼容,来看下charsequence的文档: 

【Android】 Android中spinner下拉列表的使用

    不难看出,string和stringbuffer都是charsequence的子类,这里定义为charsequence后直接使用字符串格式是没有问题的。 

    下面直接运行程序,我们可以看到如下效果: 

【Android】 Android中spinner下拉列表的使用

    此时列表项的显示和之前的不同,是因为我们在实例化arrayadapter时使用了android.r.layout.simple_spinner_item,也就是使用了简单的spinner项。 

    可以通过如下的代码控制显示风格: 

【Android】 Android中spinner下拉列表的使用

cities.setdropdownviewresource(android.r.layout.simple_spinner_dropdown_item);// 设置列表项的显示风格  

    之后再次运行代码,就可以看到和之前一样的显示效果了。 

    下面来看第二种arrayadapter的使用方式,就是在程序中动态生成结果来进行填充,我们修改上面的代码,最终为: 

【Android】 Android中spinner下拉列表的使用

import java.util.arrays;  

import android.widget.linearlayout;  

    // 省略city部分spinner和arrayadapter声明的代码  

    private spinner age = null;// 声明一个spinner组件,表示年龄  

    private arrayadapter<charsequence> ages = null;// 声明一个arrayadapter来适配年龄  

    private list<charsequence> age_data = null;// 声明一个放置年龄数据的list  

        // 省略city部分的设置代码  

        age = new spinner(this);// 创建spinner对象  

        age.setprompt("您的年龄段是:");// 设置prompt  

        age_data = arrays.aslist(new charsequence[] { "10岁以下", "10-20岁",  

                "20-30岁", "30-40岁", "40-50岁", "50-60岁", "60岁以上" });// 设置年龄段数组并最终转换为list类型  

        ages = new arrayadapter<charsequence>(this,  

                android.r.layout.simple_spinner_item, age_data);// 实例化arrayadapter  

    ages.setdropdownviewresource(android.r.layout.simple_spinner_dropdown_item);// 设置列表项显示风格  

        age.setadapter(ages);// 设置显示信息  

        linearlayout layout = (linearlayout) super.findviewbyid(r.id.layout);  

        textview agelabel=new textview(this);  

        agelabel.settext("请选择您的年龄段");  

        layout.addview(agelabel);  

        layout.addview(age);  

    在此之前,不要忘了在main.xml中为我们的布局管理器加上id属性,这样才能在程序中进行调用,运行程序,我们可以看到如下效果: 

【Android】 Android中spinner下拉列表的使用

    点击即可弹出下拉列表框显示具体内容了。 

    下面我们在android设备上来运行spinner的示例程序,运行环境为motorola defy+ 2.3.7 miui,所得到的具体显示效果为: 

【Android】 Android中spinner下拉列表的使用

    可以看出,这和我们在模拟器中的显示效果略有不同,那么就是手机所刷rom对我们组件显示风格的影响了,也就是说,在不同的rom下,会有不同的显示效果。 

参考网址:http://sarin.iteye.com/blog/1669773

继续阅读