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

简介:

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

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

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

[html]  view plain copy
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <Spinner  
  8.         android:id="@+id/spinner1"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content"  
  11.       />  
  12. </LinearLayout></span>  
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:16px;">  </span>  
  【注意:】上面的Spinner有两个属性1:prompt是初始的时候,Spinner显示的数据,是一个引用类型   2:entries是直接在xml布局文件中绑定数据源(可以不设置,即可以在Activity中动态绑定) 

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

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string-array name="spinnername">  
  4.         <item>北京</item>  
  5.         <item>上海 </item>  
  6.         <item>广州</item>  
  7.         <item>深圳</item>  
  8.     </string-array>  
  9. </resources></span>  
      

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


[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.              // 初始化控件  
  2. mSpinner = (Spinner) findViewById(R.id.spinner1);  
  3. // 建立数据源  
  4. String[] mItems = getResources().getStringArray(R.array.spinnername);  
  5. // 建立Adapter并且绑定数据源  
  6. ArrayAdapter<String> _Adapter=new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, mItems);  
  7. //绑定 Adapter到控件  
  8. mSpinner.setAdapter(_Adapter);  
        

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

 

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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.      mSpinner.setOnItemSelectedListener(new OnItemSelectedListener() {  
  2. @Override  
  3. public void onItemSelected(AdapterView<?> parent, View view,  
  4.         int position, long id) {  
  5.     String str=parent.getItemAtPosition(position).toString();  
  6.     Toast.makeText(SpinnerActivity.this"你点击的是:"+str, 2000).show();  
  7. }  
  8. @Override  
  9. public void onNothingSelected(AdapterView<?> parent) {  
  10.     // TODO Auto-generated method stub  
  11. }  
  12. );  
 


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

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

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?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="horizontal" >  
  6.   
  7.     <TextView  
  8.         android:id="@+id/textView1"  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:drawableLeft="@drawable/ic_launcher"  
  12.         android:paddingRight="8dip"  
  13.         android:paddingTop="8dip"  
  14.         android:text="TextView"  
  15.         android:textSize="25sp" />  
  16.   
  17.     <TextView  
  18.         android:id="@+id/textView2"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"  
  21.         android:paddingLeft="8dip"  
  22.         android:paddingTop="8dip"  
  23.         android:text="TextView"  
  24.         android:textSize="25sp" />  
  25.   
  26. </LinearLayout>  

        ②:建立Person类:

  

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.jiangqq.csdn;  
  2. public class Person {  
  3.     private String personName;  
  4.     private String personAddress;  
  5.     public Person(String personName, String personAddress) {  
  6.         super();  
  7.         this.personName = personName;  
  8.         this.personAddress = personAddress;  
  9.     }  
  10.     public String getPersonName() {  
  11.         return personName;  
  12.     }  
  13.     public void setPersonName(String personName) {  
  14.         this.personName = personName;  
  15.     }  
  16.     public String getPersonAddress() {  
  17.         return personAddress;  
  18.     }  
  19.     public void setPersonAddress(String personAddress) {  
  20.         this.personAddress = personAddress;  
  21.     }  
  22.   
  23. }  
       ③:创建MyAdapter继承与BaseAdapter,进行适配:

    

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.jiangqq.csdn;  
  2.   
  3. import java.util.List;  
  4. import android.content.Context;  
  5. import android.view.LayoutInflater;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.BaseAdapter;  
  9. import android.widget.TextView;  
  10.   
  11. /** 
  12.  * 自定义适配器类 
  13.  * @author jiangqq  <a href=http://blog.csdn.net/jiangqq781931404></a> 
  14.  * 
  15.  */  
  16. public class MyAdapter extends BaseAdapter {  
  17.     private List<Person> mList;  
  18.     private Context mContext;  
  19.   
  20.     public MyAdapter(Context pContext, List<Person> pList) {  
  21.         this.mContext = pContext;  
  22.         this.mList = pList;  
  23.     }  
  24.   
  25.     @Override  
  26.     public int getCount() {  
  27.         return mList.size();  
  28.     }  
  29.   
  30.     @Override  
  31.     public Object getItem(int position) {  
  32.         return mList.get(position);  
  33.     }  
  34.   
  35.     @Override  
  36.     public long getItemId(int position) {  
  37.         return position;  
  38.     }  
  39.     /** 
  40.      * 下面是重要代码 
  41.      */  
  42.     @Override  
  43.     public View getView(int position, View convertView, ViewGroup parent) {  
  44.         LayoutInflater _LayoutInflater=LayoutInflater.from(mContext);  
  45.         convertView=_LayoutInflater.inflate(R.layout.item, null);  
  46.         if(convertView!=null)  
  47.         {  
  48.             TextView _TextView1=(TextView)convertView.findViewById(R.id.textView1);  
  49.             TextView _TextView2=(TextView)convertView.findViewById(R.id.textView2);  
  50.             _TextView1.setText(mList.get(position).getPersonName());  
  51.             _TextView2.setText(mList.get(position).getPersonAddress());  
  52.         }  
  53.         return convertView;  
  54.     }  
  55. }  

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

   

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.                 // 初始化控件  
  2. mSpinner = (Spinner) findViewById(R.id.spinner1);  
  3. // 建立数据源  
  4.    List<Person>  persons=new ArrayList<Person>();  
  5. persons.add(new Person("张三""上海 "));  
  6. persons.add(new Person("李四""上海 "));  
  7. persons.add(new Person("王五""北京" ));  
  8. persons.add(new Person("赵六""广州 "));  
  9. //  建立Adapter绑定数据源  
  10. MyAdapter _MyAdapter=new MyAdapter(this, persons);  
  11. //绑定Adapter  
  12. mSpinner.setAdapter(_MyAdapter);  
  运行效果如下截图:

  

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


方式二:

    在Web开发中,HTML提供了下拉列表的实现,就是使用<select>元素实现一个下拉列表,在其中每个下拉列表项使用<option>表示即可。这是在Web开发中一个必不可少的交互性组件,在Android中的对应实现就是Spinner。
    首先来看一下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项目,编写代码: 

Xml代码   收藏代码
  1. <TextView  
  2.     android:id="@+id/degreeLabel"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:text="请选择您的学历" />  
  6. <Spinner  
  7.     android:id="@+id/degree"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content" />  

    这里放置了一个空的Spinner,直接运行程序,我们看到如下效果: 
 
    就是一个空的下拉框,什么都没有,下面我们开始向这个下拉框中设置列表项。首先我们使用XML资源文件的配置方式,在values目录下创建spinner_data.xml,并设置如下内容: 
Xml代码   收藏代码
  1. <string-array name="degrees">  
  2.     <item>初中及以下</item>  
  3.     <item>高中</item>  
  4.     <item>大学</item>  
  5.     <item>研究生及以上</item>  
  6. </string-array>  

    不难理解<string-array>表示字符串的数组,就是可以定义多个字符串的项目,在其中,我们仍然使用<item>来定义每一项,设置好后,将其应用到Spinner中: 
Xml代码   收藏代码
  1. <Spinner  
  2.     android:id="@+id/degree"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:entries="@array/degrees" />  

    配置Spinner组件中的entries属性即可引用我们在spinner_data.xml中定义的degrees项目组了,不难想到,它已经被注册到R.java中了。运行程序,我们得到如下显示效果: 
 
    这里可以看到,我们虽然设置了提示信息,但是点击下拉框后并没有出现Spinner的提示,而是直接显示出了我们设置的选项,这样的显示并不是很好看,我们希望在弹出的Spinner选择框上也给出提示,那么我们可以这么来设置: 
Xml代码   收藏代码
  1. <Spinner  
  2.     android:id="@+id/degree"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:entries="@array/degrees"  
  6.     android:prompt="@string/degrees_prompt" />  

    也就是在Spinner组件中加上prompt属性即可,注意这里不能直接使用文本了,而需要使用引用,那么我们在strings.xml中加入如下信息: 
Xml代码   收藏代码
  1. <string name="degrees_prompt">您的学历是:</string>  

   我们再次运行程序,就可以看到如下的效果: 
 
    这次再点击Spinner,弹出的下拉框中就有了提示的prompt,显示效果好了很多。 
    下面我们看看如何通过程序来控制Spinner和列表项,之前说过要使用程序,就要用到Adapter类,这里我们使用实现类ArrayAdapter来进行操作。首先我们使用ArrayAdapter读取XML配置文件的方式来说明: 
Xml代码   收藏代码
  1. <string-array name="cities">  
  2.     <item>北京</item>  
  3.     <item>上海</item>  
  4.     <item>大连</item>  
  5. </string-array>  

    我们在spinner_data.xml中再设置一组值来表示城市,有了列表项,我们还需要再创建一个Spinner,那么在main.xml中,再设置一个Spinner: 
Xml代码   收藏代码
  1. <TextView  
  2.     android:id="@+id/cityLabel"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:text="请选择您所在的城市" />  
  6. <Spinner  
  7.     android:id="@+id/city"  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="wrap_content" />  

    那么在Activity程序中,我们可以如下来编写代码: 
Java代码   收藏代码
  1. package org.ourpioneer;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.widget.ArrayAdapter;  
  5. import android.widget.Spinner;  
  6. public class SpinnerDemoActivity extends Activity {  
  7.     private Spinner city = null;// 要读取的下拉列表  
  8.     private ArrayAdapter<CharSequence> cities = null;// 要使用的Adapter  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         super.setContentView(R.layout.main);  
  12.         city = (Spinner) super.findViewById(R.id.city);// 获取下拉列表  
  13.         city.setPrompt("您所在的城市是:");// 设置Prompt  
  14.         cities = ArrayAdapter.createFromResource(this, R.array.cities,android.R.layout.simple_spinner_item);// 实例化ArrayAdapter  
  15.         city.setAdapter(cities);// 设置显示信息  
  16.     }  
  17. }  

    根据代码中的注释,不难理解每行代码的意思,这和在XML中配置Spinner是类似的。要多说的一点就是这里我们为ArrayAdapter设置的泛型是CharSequence,而不是直接使用String,这是出于以后对StringBuffer的兼容,来看下CharSequence的文档: 
 
    不难看出,String和StringBuffer都是CharSequence的子类,这里定义为CharSequence后直接使用字符串格式是没有问题的。 
    下面直接运行程序,我们可以看到如下效果: 
 
    此时列表项的显示和之前的不同,是因为我们在实例化ArrayAdapter时使用了android.R.layout.simple_spinner_item,也就是使用了简单的spinner项。 
    可以通过如下的代码控制显示风格: 
Java代码   收藏代码
  1. cities.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项的显示风格  

    之后再次运行代码,就可以看到和之前一样的显示效果了。 
    下面来看第二种ArrayAdapter的使用方式,就是在程序中动态生成结果来进行填充,我们修改上面的代码,最终为: 
Java代码   收藏代码
  1. package org.ourpioneer;  
  2. import java.util.Arrays;  
  3. import java.util.List;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. import android.widget.ArrayAdapter;  
  7. import android.widget.LinearLayout;  
  8. import android.widget.Spinner;  
  9. import android.widget.TextView;  
  10.   
  11. public class SpinnerDemoActivity extends Activity {  
  12.     // 省略City部分Spinner和ArrayAdapter声明的代码  
  13.     private Spinner age = null;// 声明一个Spinner组件,表示年龄  
  14.     private ArrayAdapter<CharSequence> ages = null;// 声明一个ArrayAdapter来适配年龄  
  15.     private List<CharSequence> age_data = null;// 声明一个放置年龄数据的List  
  16.     public void onCreate(Bundle savedInstanceState) {  
  17.         super.onCreate(savedInstanceState);  
  18.         super.setContentView(R.layout.main);  
  19.         // 省略City部分的设置代码  
  20.         age = new Spinner(this);// 创建Spinner对象  
  21.         age.setPrompt("您的年龄段是:");// 设置Prompt  
  22.         age_data = Arrays.asList(new CharSequence[] { "10岁以下""10-20岁",  
  23.                 "20-30岁""30-40岁""40-50岁""50-60岁""60岁以上" });// 设置年龄段数组并最终转换为List类型  
  24.         ages = new ArrayAdapter<CharSequence>(this,  
  25.                 android.R.layout.simple_spinner_item, age_data);// 实例化ArrayAdapter  
  26.     ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项显示风格  
  27.         age.setAdapter(ages);// 设置显示信息  
  28.         LinearLayout layout = (LinearLayout) super.findViewById(R.id.layout);  
  29.         TextView ageLabel=new TextView(this);  
  30.         ageLabel.setText("请选择您的年龄段");  
  31.         layout.addView(ageLabel);  
  32.         layout.addView(age);  
  33.     }  
  34. }  

    在此之前,不要忘了在main.xml中为我们的布局管理器加上ID属性,这样才能在程序中进行调用,运行程序,我们可以看到如下效果: 
 
    点击即可弹出下拉列表框显示具体内容了。 
    下面我们在Android设备上来运行Spinner的示例程序,运行环境为Motorola Defy+ 2.3.7 MIUI,所得到的具体显示效果为: 
 
    可以看出,这和我们在模拟器中的显示效果略有不同,那么就是手机所刷ROM对我们组件显示风格的影响了,也就是说,在不同的ROM下,会有不同的显示效果。 


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

相关文章
|
8月前
|
Android开发
Android 中使用spinner实现下拉列表的两种方法和getItemAtPosition()方法的使用
Android 中使用spinner实现下拉列表的两种方法和getItemAtPosition()方法的使用
62 0
|
4月前
|
XML Java Android开发
Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)
Android Studio App开发中高级控件下拉列表Spinner的讲解及实战(附源码 超详细必看)
72 0
|
Android开发
Android中的高级控件Spinner
Android中的高级控件Spinner
103 0
|
Java Android开发 开发者
Android Spinner与自定义TextView填坑记
Android Spinner与自定义TextView填坑记
122 0
Android Spinner与自定义TextView填坑记
|
Android开发
Android官方下拉选择控件Spinner
Android官方下拉选择控件Spinner
350 0
Android官方下拉选择控件Spinner
|
Android开发
Android Studio 下拉框Spinner实例
本文目录 1. 功能 2. 显示 3. 动态设置选项 4. 获取选中项 5. 监听下拉框选中项
888 0
Android Studio 下拉框Spinner实例
|
XML Android开发 数据格式
Android 好用的下拉控件Spinner
一、参考 1、android Spinner控件详解 2、最新Spinner用法详解 二、实例 1、普通的spinner用法及在string-array中的数据加载,此UI是在MD风格下,在不同Theme下其实是有不同UI展示,也可选择下拉模式是:dropdown或者dialog,默认是dropdown的 1-2.
1066 0
|
XML Android开发 数据格式
Android开发之自定义Spinner
自定义Spinner,需要定制的有默认背景、按下背景,显示时每一项的样式以及弹出时每一项的样式四个方面。下面举个简单例子。 1、准备两张图片,处理为.9png,分别为spinner.
1306 0
|
Android开发
Android实现多层级Spinner列表选项实时更新树形层级
Android实现多层级Spinner列表选项实时更新树形层级 运行结果如图: Java代码: package com.
1349 0
|
Android开发
Android Spinner的ArrayAdapter和SpinnerAdapter注意事项
Android Spinner的ArrayAdapter和SpinnerAdapter注意事项 如图所示: 代码: package com.
1262 0