安卓入门--Spinner控件与二级联动详解

来源:互联网 发布:百万公众网络答题活动 编辑:程序博客网 时间:2024/06/05 00:17

SPinner

  • 父类:AbsSpinner–AdapterView
  • 定义:下拉菜单控件

常用方法:

  • android:spinnerMode:

    1. dialog---对话框模式2. dropdown--下拉模式
  • dropdown效果

    这里写图片描述

  • dialog效果:
    这里写图片描述

  • android:prompt(标题的设置)

    1. 仅仅只有在spinnerMode:dialog下才能生效1. ="@string/name2"(需要通过@string/的方式去获得不可直接赋值)

这里写图片描述
* android:entries

    这个格式是规定的 @后面不是文件名。    因为这是android里面的约定 资源文件里面的数组都用R.array.xxx表示    就如同要找到组件布局必须用R.layout.xxx表示一样    citys是数组名 存在values下声明:    <string-array name="citys">            <item >北京</item>            <item >上海</item>            <item >成都</item>            <item >南京</item>        </string-array>    但在实际开发中不建议这么用,这种模式是写死了,如果需要改动很麻烦只需要了解即可
  • android:popupBackground(背景颜色)

    1. 为下拉区域给定一个颜色2. 只有当spinnerMode为:dropdown是才生效
  • 背景颜色的改变
    这里写图片描述

Spinner以代码方式展示Spinner选项

  • 数组类型
import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.ArrayAdapter;import android.widget.Spinner;/** *  * @author sKy° * Spinner:使用适配器绑定数据源为 "数组类型" 的数据 * @d2016-5-13 */public class MainActivity extends Activity {//  初始化所需数据    private  Spinner spinner;    private  ArrayAdapter<String> adapter;    private  String[] data;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//      找到spinner控件        spinner=(Spinner) findViewById(R.id.sp);//      创建数据源        data=new String[]{"东京","成都","上海","南京"};//      数据源与适配器绑定        adapter=new ArrayAdapter<String>(this,                 android.R.layout.simple_list_item_1,                data);//      Spinner控件与适配器绑定        spinner.setAdapter(adapter);    }   }
  • 集合类型
import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.Spinner;/** *  * @author sKy°  * 2.Spinner:使用适配器绑定数据源为 "集合类型" 的数据 * @d2016-5-13 *  */public class secendActivity extends Activity {//      初始化数据    private Spinner spinner;    private List<String> data;    private ArrayAdapter<String> adapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//      通过id获得控件        spinner = (Spinner) findViewById(R.id.sp);//      创建数据源   (也可以写一个方法,通过循环遍历去添加集合元素)        data=new ArrayList<String>();        data.add("北京");        data.add("成都");        data.add("上海");        data.add("南京");//      数据源与适配器绑定        adapter=new ArrayAdapter<String>(this,                 android.R.layout.simple_list_item_1,                data);//      Spinner控件绑定适配器        spinner.setAdapter(adapter);    }}
  • 效果:
    这里写图片描述

  • Spinner二级连动设置

  • 分析: 二级联动 是由第一级控件触发点击事件后第二级的控件去给出对应的值     比如输入第一级控件选择为北京那么第二级控件就会给出所属的对应区       北京----东城、西城、宣武这样的 一个效果思路:1.创建数据源、设置Spinner控件     2.把对应的"市"作为一个数据源  把该市对应的"区"又作为一个数据源,由此我们这里就需要两个数据源(市、区)     3.因为是由第一个控件触发点击事件后 第二个控件的值会对应的给出,所以我们只需要对第一个控件进行一个监听,时刻监听第一个控件     的触发的事件去给第二个控件赋值     4.最后是Spinner控件去绑定对应的适配器,对应的给出适配器绑定对应的数据源,完成!
  • 控件设定部分:
    这里写图片描述

  • 对应的类获取对应的数据(市、区)部分:
    这里写图片描述

这里写图片描述

  • mainActivity代码部分:
package com.example.adapter;import java.util.ArrayList;import java.util.List;import com.entiy.place.Citys;import com.entiy.place.Province;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Adapter;import android.widget.AdapterView;import android.widget.AdapterView.OnItemSelectedListener;import android.widget.ArrayAdapter;import android.widget.Spinner;/** *  * @author sKy° * 代码部分 * @d2016-5-13 */public class ThreeActivity extends Activity implements OnItemSelectedListener{    private Spinner spinner1, spinner2;    private List<Citys> data;    private List<Province> provinces;    private List<String> city;    private ArrayAdapter<String> adapter1,adapter2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);//      通过资源ID找到控件        spinner1 = (Spinner) findViewById(R.id.sp);        spinner2 = (Spinner) findViewById(R.id.sp1);//      创建数据源        getData();        getPriovince();//      数据源与第一级的适配器        adapter1 = new ArrayAdapter<String>(this,                android.R.layout.simple_list_item_1,                city);        spinner1.setAdapter(adapter1);        spinner1.setOnItemSelectedListener(this);    }   //  重写OnItemSelectedListener方法    @Override    public void onItemSelected(AdapterView<?> parent, View view, int position,            long id) {//  设置第二个控件给定数据源绑定适配器                           String p_name = city.get(position).trim();                List<String> citys = getCitys(p_name);                adapter2=new ArrayAdapter<String>(this,                        android.R.layout.simple_list_item_1,                         citys);                spinner2.setAdapter(adapter2);    }    @Override    public void onNothingSelected(AdapterView<?> parent) {        // TODO Auto-generated method stub    }//   设定一个方法   把数据(市、区)装到对应的集合里面    private void getData(){//      创建集合 把city数据添加到集合        data=new ArrayList<Citys>();        provinces=new ArrayList<Province>();        Citys citys=null;        Province province=null;//      北京市区        citys=new Citys("东城");        data.add(citys);        citys=new Citys("西城");        data.add(citys);        citys=new Citys("宣武");        data.add(citys);        province=new Province("北京", data);        provinces.add(province);//      上海市区        data=new ArrayList<Citys>();           citys=new Citys("黄浦");        data.add(citys);        citys=new Citys("卢湾");        data.add(citys);        citys=new Citys("嘉定");        data.add(citys);        province=new Province("上海", data);        provinces.add(province);//      成都市区        data=new ArrayList<Citys>();        citys=new Citys("青羊");        data.add(citys);        citys=new Citys("锦江");        data.add(citys);        citys=new Citys("武侯");        data.add(citys);        province=new Province("成都", data);        provinces.add(province);//      天津市区        data=new ArrayList<Citys>();        citys=new Citys("塘沽");        data.add(citys);        citys=new Citys("蓟县");        data.add(citys);        citys=new Citys("宝坻");        data.add(citys);        province=new Province("天津", data);        provinces.add(province);    }//  通过遍历集合获得市的名字 --备用赋值给Spinner1    private void getPriovince(){            city=new ArrayList<String>();            for (Province province : provinces) {                String cityname = province.getP_name();                city.add(cityname);            }    }//  通过市获得区--备用赋值给Spinner2    private List<String> getCitys(String c_name){    List<String> citylist=new ArrayList<String>();        for (Province province : provinces) {            if (c_name.equals(province.getP_name())) {                    List<Citys> citys = province.getCitys();                    for (Citys citys2 : citys) {                        String cityName = citys2.getCity();                        citylist.add(cityName);                    }            }        }        return citylist;    }}
  • 二级联动最终效果,可以看到当选择为成都时给出了对应的区:
    这里写图片描述

Adapter的三个参数

* Contex context:是一个上下文(这里可以用this表示):* int resource:需要绑定用于展示的一个Layout布局* T[] objects:泛型数组,也可以用集合表示(注:Spinner适配器只支持两种数据1.泛型数组 2.泛型集合)

源码里面的解释:
这里写图片描述

0 0