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

SPinner

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

常用方法:

  • android:spinnerMode:

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

    安卓入门--Spinner控件与二级联动详解_第1张图片

  • dialog效果:
    安卓入门--Spinner控件与二级联动详解_第2张图片

  • android:prompt(标题的设置)

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

安卓入门--Spinner控件与二级联动详解_第3张图片
* android:entries

    这个格式是规定的 @后面不是文件名。
    因为这是android里面的约定 资源文件里面的数组都用R.array.xxx表示
    就如同要找到组件布局必须用R.layout.xxx表示一样
    citys是数组名 存在values下声明:
    
            北京
            上海
            成都
            南京
        

    但在实际开发中不建议这么用,这种模式是写死了,如果需要改动很麻烦只需要了解即可
  • android:popupBackground(背景颜色)

    1. 为下拉区域给定一个颜色
    2. 只有当spinnerMode为:dropdown是才生效
    
  • 背景颜色的改变
    安卓入门--Spinner控件与二级联动详解_第4张图片

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 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(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 data;
    private ArrayAdapter 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();
        data.add("北京");
        data.add("成都");
        data.add("上海");
        data.add("南京");
//      数据源与适配器绑定
        adapter=new ArrayAdapter(this, 
                android.R.layout.simple_list_item_1,
                data);
//      Spinner控件绑定适配器
        spinner.setAdapter(adapter);
    }




}
  • 效果:
    安卓入门--Spinner控件与二级联动详解_第5张图片

  • Spinner二级连动设置

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

  • 对应的类获取对应的数据(市、区)部分:
    安卓入门--Spinner控件与二级联动详解_第7张图片

安卓入门--Spinner控件与二级联动详解_第8张图片

  • 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 data;
    private List provinces;
    private List city;
    private ArrayAdapter 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(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 citys = getCitys(p_name);

                adapter2=new ArrayAdapter(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();
        provinces=new ArrayList();
        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=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=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=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();
            for (Province province : provinces) {
                String cityname = province.getP_name();
                city.add(cityname);
            }

    }
//  通过市获得区--备用赋值给Spinner2
    private List getCitys(String c_name){
    List citylist=new ArrayList();
        for (Province province : provinces) {
            if (c_name.equals(province.getP_name())) {
                    List citys = province.getCitys();
                    for (Citys citys2 : citys) {
                        String cityName = citys2.getCity();
                        citylist.add(cityName);
                    }
            }

        }

        return citylist;
    }

}


  • 二级联动最终效果,可以看到当选择为成都时给出了对应的区:
    安卓入门--Spinner控件与二级联动详解_第9张图片

Adapter的三个参数

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

源码里面的解释:
安卓入门--Spinner控件与二级联动详解_第10张图片

你可能感兴趣的:(安卓入门--Spinner控件与二级联动详解)