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

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

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

[html] view plaincopy
  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. <Spinner
  7. android:id="@+id/spinner1"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. />
  11. </LinearLayout></span>
[html] view plaincopy
  1. <span style="font-size:16px;">  </span>

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

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

[plain] view plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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. <TextView
  7. android:id="@+id/textView1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:drawableLeft="@drawable/ic_launcher"
  11. android:paddingRight="8dip"
  12. android:paddingTop="8dip"
  13. android:text="TextView"
  14. android:textSize="25sp" />
  15. <TextView
  16. android:id="@+id/textView2"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:paddingLeft="8dip"
  20. android:paddingTop="8dip"
  21. android:text="TextView"
  22. android:textSize="25sp" />
  23. </LinearLayout>

②:建立Person类:

[java] view plaincopy
  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. }

③:创建MyAdapter继承与BaseAdapter,进行适配:

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

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

[java] view plaincopy
  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. public class SpinnerDemoActivity extends Activity {
  11. // 省略City部分Spinner和ArrayAdapter声明的代码
  12. private Spinner age = null;// 声明一个Spinner组件,表示年龄
  13. private ArrayAdapter<CharSequence> ages = null;// 声明一个ArrayAdapter来适配年龄
  14. private List<CharSequence> age_data = null;// 声明一个放置年龄数据的List
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. super.setContentView(R.layout.main);
  18. // 省略City部分的设置代码
  19. age = new Spinner(this);// 创建Spinner对象
  20. age.setPrompt("您的年龄段是:");// 设置Prompt
  21. age_data = Arrays.asList(new CharSequence[] { "10岁以下", "10-20岁",
  22. "20-30岁", "30-40岁", "40-50岁", "50-60岁", "60岁以上" });// 设置年龄段数组并最终转换为List类型
  23. ages = new ArrayAdapter<CharSequence>(this,
  24. android.R.layout.simple_spinner_item, age_data);// 实例化ArrayAdapter
  25. ages.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置列表项显示风格
  26. age.setAdapter(ages);// 设置显示信息
  27. LinearLayout layout = (LinearLayout) super.findViewById(R.id.layout);
  28. TextView ageLabel=new TextView(this);
  29. ageLabel.setText("请选择您的年龄段");
  30. layout.addView(ageLabel);
  31. layout.addView(age);
  32. }
  33. }

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

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

【Android】 Android中spinner下拉列表的使用相关推荐

  1. Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

    Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)

  2. android arrayadapter自定义,Android中Spinner下拉列表(使用ArrayAdapter和自定义Adapter实现)...

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

  3. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服 ...

  4. HTML左侧下拉列表,HTML中的下拉列表 select

    HTML中的下拉列表: Volvo Saab Opel Audi 其中select是显示一个下拉列表(drop down list)出来,option是下拉列表中的项目(item),而option的文 ...

  5. (Spinner) android中Spinner的使用

    (Spinner) android中Spinner的使用 Spinner这个组件配置之后需要进行内容的设置,而内容可以使用配置文件完成,也可以通过ArrayAdapter类进行封装操作完成 单机选项p ...

  6. Android——适配器其他组件(AutoCompleteTextView:自动完成文本编辑框;Spinner:下拉列表)...

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

  7. Android Spinner –下拉列表

    This tutorial will give you a hands on experience in using Android Spinner as a drop down menu, pass ...

  8. android studio 下拉菜单,怎么在android studio中使用Spinner实现一个下拉菜单

    怎么在android studio中使用Spinner实现一个下拉菜单 发布时间:2021-03-23 14:56:15 来源:亿速云 阅读:92 作者:Leah 这期内容当中小编将会给大家带来有关怎 ...

  9. Android 中 Spinner下拉框使用

    文章目录 先用起来 方法和属性 样式 增加分割线 选中和下拉样式 弹出框样式 使用自定义的BaseAdapter 先用起来 效果图 布局页面 activity_test <?xml versio ...

最新文章

  1. 实战篇:如何用Keras建立神经网络(附全部代码)
  2. 大学最重要的七项学习
  3. 听说别人都在送小黄车月卡?神策数据送两个月!
  4. 查看mysql库大小,表大小,索引大小
  5. C#编程高并发的几种处理方法
  6. 零式机器人_最帅机器人作品“EVA”“天元突破”谁才是男人真正的浪漫
  7. pytorch 学习率代码_DL知识拾贝(Pytorch)(五):如何调整学习率
  8. LastPass 的开源替代品
  9. 《数据库系统概念》19-并发控制
  10. crash fault-tolerant protocols和Byzantine fault-tolerant protocols区别
  11. h5中的结构元素header、nav、article、aside、section、footer介绍
  12. epub文件如何打开?
  13. SQL Server选择题40个
  14. 程序员为什么要学习软件工程
  15. C#实现在CAD图纸中插入另一个DWG图块的代码
  16. 微信公众号测试账号网址
  17. 手把手微信机器人部署教学
  18. 石河子大学师生为荣获2018年“马云乡村教师奖”校友点赞
  19. 40岁应该学会的是面对和取舍
  20. Aspose.Words使用教程大全

热门文章

  1. TWebBrowser的基本应用
  2. 汉拓中国CRM评估报告简介
  3. html移动端沉浸式状态栏,app沉浸式状态实现分享,解决状态栏遮挡顶部的问题...
  4. 玛纽尔扫地机器人怎样_扫地机器人怎样选?科沃斯超能王VS云鲸对比测试,看完你就懂了...
  5. poj3273---Monthly Expense
  6. vuejs之【router-link】大全(二)
  7. js随机生成4位验证码
  8. 什么叫「人的格局」?是否有必要培养大的格局或怎么培养?
  9. web.xml 通过contextConfigLocation配置spring 的方式
  10. winform中关于panel中滚动条和键盘事件几点体会