Spinner 实现省市县的三级联动 1801210908- 杨超 下拉框 Spinner 控件 : 常用属性 属性 说明 android:prompt 下拉提示信息 android:spinnermode 下拉显示方法 android:entries 配置下拉框数据源 android:dropdownwidth 下拉框显示模式下的显示项宽度 常用方法 方法 说明 getdropdownwidth() 获得下拉框宽度 getprompt() 获取下拉框提示信息 setadapter(spinneradapter adapter) 设置数据源适配器 setdropdownwidth(int pixels) 设置下拉框宽度 setonitemselectedlistener(adapterview.o 设置下拉项选择监听 nitemselectedlistener I) setprompt(charsequence prompt) 设置下拉提示信息 setdropdownviewresource(int resid) 设置下拉显示样式 列表项配置方式 通过布局文件的 entries 属性配置编写数据源文件, 用 string-array 标签包裹, 每一个 item 代表一个下拉列表项 然后在布
局文件中用 android:entries 属性引用 在代码中配置 以适配器形式设置数据源, 并设置下拉项选 择监听 一 修改布局文件 activity_main.xml 代码 : <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:textsize="20sp" android:text="@string/selection" android:padding="6dp"/>
<LinearLayout android:layout_width="match_parent" android:layout_margintop="30dp" android:orientation="horizontal"> <Spinner android:id="@+id/provincespinner" android:layout_width="wrap_content" android:layout_weight="1"/> <Spinner android:id="@+id/cityspinner" android:layout_width="wrap_content" android:layout_weight="1"/> <Spinner android:id="@+id/countyspinner" android:layout_width="wrap_content" android:layout_weight="1"/> </LinearLayout> <TextView android:id="@+id/show" android:layout_width="wrap_content" android:textsize="20sp" android:padding="6dp" android:layout_margintop="80dp" android:text="@string/selected"/> 二 修改 MainActivity.java 文件 1. 首先准备数据这里用字符串数组的方式存数据 代码如下 : private String[] province = new String[]{" 北京 "," 上海 "," 天津 "," 广东 "; private String[][] city = new String[][]{ {" 东城区 "," 西城区 "," 崇文区 "," 宣武区 "," 朝阳区 "," 海淀区 "," 丰台区 "," 石景山区 "," 门头沟区 ",
" 房山区 "," 通州区 "," 顺义区 "," 大兴区 "," 昌平区 "," 平谷区 "," 怀柔区 "," 密云县 "," 延庆县 " {" 长宁区 "," 静安区 "," 普陀区 "," 闸北区 "," 虹口区 " {" 和平区 "," 河东区 "," 河西区 "," 南开区 "," 河北区 "," 红桥区 "," 塘沽区 "," 汉沽区 "," 大港区 "," 东丽区 " {" 广州 "," 深圳 "," 韶关 "; private String[][][] county = new String[][][]{ { // 北京 {" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {// 上海 {" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {// 天津 {" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {// 广东 {" 海珠区 "," 荔湾区 "," 越秀区 "," 白云区 "," 萝岗区 "," 天河区 "," 黄浦区 "," 花都区 "," 从化市 "," 增城市 "," 番禺区 "," 南沙区 " {" 宝安区 "," 福田区 "," 龙岗区 "," 罗湖区 "," 南山区 "," 盐田区 " {" 武江区 "," 浈江区 "," 曲江区 "," 乐昌市 "," 南雄市 "," 始兴县 "," 仁化县 "," 翁源县 "," 新丰县 "," 乳源县 " ; 2. 声明布局文件对应的对象 3. 声明适配器 4. 在 oncreate 方法中, 调用初始化控件方法 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main); initviews();// 初始化控件方法 5. 编写 initviews() 方法 (1) 获取对应布局文件的控件 (2) 初始化适配器及显示的内容因为最先选择的是省份, 所以最先初始化适配器的是省份对应的 provinceadapter, 市级的需要在选中省级的时候, 动态的改变市级对应的显示, 县级的需要在选中市级的时候动态的改变 (3) 对省级下拉实现监听 (4) 对市级实现下拉监听
(5) 对县级实现下拉监听 6. 代码 public class MainActivity extends AppCompatActivity { private TextView show; private Spinner provincespinner;// 省级 private Spinner cityspinner;// 市级 private Spinner countyspinner;// 区级 private String[] province = new String[]{" 北京 "," 上海 "," 天津 "," 广东 "; private String[][] city = new String[][]{ {" 东城区 "," 西城区 "," 崇文区 "," 宣武区 "," 朝阳区 "," 海淀区 "," 丰台区 "," 石景山区 "," 门头沟区 ", " 房山区 "," 通州区 "," 顺义区 "," 大兴区 "," 昌平区 "," 平谷区 "," 怀柔区 "," 密云县 "," 延庆县 " {" 长宁区 "," 静安区 "," 普陀区 "," 闸北区 "," 虹口区 " {" 和平区 "," 河东区 "," 河西区 "," 南开区 "," 河北区 "," 红桥区 "," 塘沽区 "," 汉沽区 "," 大港区 "," 东丽区 " {" 广州 "," 深圳 "," 韶关 "; private String[][][] county = new String[][][]{ { // 北京 {" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "
增城市 " 乳源县 " ; {" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {// 上海 {" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {// 天津 {" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 "{" 无 " {// 广东 {" 海珠区 "," 荔湾区 "," 越秀区 "," 白云区 "," 萝岗区 "," 天河区 "," 黄浦区 "," 花都区 "," 从化市 ","," 番禺区 "," 南沙区 " {" 宝安区 "," 福田区 "," 龙岗区 "," 罗湖区 "," 南山区 "," 盐田区 " {" 武江区 "," 浈江区 "," 曲江区 "," 乐昌市 "," 南雄市 "," 始兴县 "," 仁化县 "," 翁源县 "," 新丰县 "," //Spinner 想要填充肯定需要适配器 private ArrayAdapter<String> provinceadapter; private ArrayAdapter<String> cityadapter; private ArrayAdapter<String> countyadapter; private int proviceposition;// 省级选中索引 private int cityposition;// 市级选中索引 protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initviews();// 初始化 // 控件初始化 private void initviews(){ provincespinner = (Spinner)findViewById(R.id.provinceSpinner); cityspinner = (Spinner) findviewbyid(r.id.cityspinner); countyspinner = (Spinner) findviewbyid(r.id.countyspinner); show = (TextView) findviewbyid(r.id.show); // 初始化适配器及显示的内容 provinceadapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item,province); provincespinner.setadapter(provinceadapter);
{ id) { // 对省级下拉实现监听, 市级下拉需要根据不同的省级显示不同内容 provincespinner.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() public void onitemselected(adapterview<?> parent, View view, int position, long // 需要在 item 选中省级的时候, 动态的改变市级对应的显示 cityadapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_spinner_item,city[position]); // 设置二级下拉列表当中选项内容适配器 cityspinner.setadapter(cityadapter); // 记录当前的省级索引位置, 留给下面修改县级进行适配使用 proviceposition = position; public void onnothingselected(adapterview<?> parent) { ); id) { // 市级下拉监听 cityspinner.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() { public void onitemselected(adapterview<?> parent, View view, int position, long // 需要在 item 选中市级的时候, 动态的改变县级对应的显示 countyadapter = new ArrayAdapter<String>( MainActivity.this,android.R.layout.simple_spinner_item,county[provicePosition][position]);// 首先确定是哪个省的 // 设置二级下拉列表当中选项内容适配器 countyspinner.setadapter(countyadapter); show.settext(" 选中的城市为 :"+ province[proviceposition] + city[proviceposition][position]); cityposition = position; public void onnothingselected(adapterview<?> parent) {
); // 县级的下拉监听 countyspinner.setonitemselectedlistener(new AdapterView.OnItemSelectedListener() { public void onitemselected(adapterview<?> parent, View view, int position, long id) { show.settext(" 选中的城市为 :"+ province[proviceposition] + city[proviceposition][cityposition] + county[proviceposition][cityposition][position]); public void onnothingselected(adapterview<?> parent) { ); 三 运行结果展示