安卓入门--Spinner控件与二级联动详解
16lz
2021-01-26
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下声明: - 北京
- 上海
- 成都
- 南京
但在实际开发中不建议这么用,这种模式是写死了,如果需要改动很麻烦只需要了解即可
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 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二级连动设置
分析: 二级联动 是由第一级控件触发点击事件后第二级的控件去给出对应的值 比如输入第一级控件选择为北京那么第二级控件就会给出所属的对应区 北京----东城、西城、宣武这样的 一个效果思路: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 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; }}
- 二级联动最终效果,可以看到当选择为成都时给出了对应的区:
Adapter的三个参数
* Contex context:是一个上下文(这里可以用this表示):* int resource:需要绑定用于展示的一个Layout布局* T[] objects:泛型数组,也可以用集合表示(注:Spinner适配器只支持两种数据1.泛型数组 2.泛型集合)
源码里面的解释:
更多相关文章
- 浅谈Android的BaseAdapter适配器模式
- Android常用UI
- 【Android(安卓)开发】:Android中普通按钮的使用方法
- Android(安卓)播放 Gif 图片控件
- 自定义控件--带动画的CheckBox
- Android(安卓)常用控件自定义样式RadioButton、CheckBox、Progre
- Android(安卓)适配器Adapter的学习
- ScrollView只能有一个子控件
- Android(安卓)CoordinatorLayout 实战案例学习《二》