自定义spinner下拉框样式,并实现三级联动

只自定义了省级的spinner下拉框的样式,地级市和县级类似。
在这里插入图片描述
在这里插入图片描述

package com.example.spinnerdemo;

import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MainActivity extends Activity {
	private Spinner provinceSpinner = null; // 省级(省、直辖市)
	private Spinner citySpinner = null; // 地级市
	private Spinner countySpinner = null; // 县级(区、县、县级市)
	ArrayAdapter<String> provinceAdapter = null; // 省级适配器
	ArrayAdapter<String> cityAdapter = null; // 地级适配器
	ArrayAdapter<String> countyAdapter = null; // 县级适配器
	static int provincePosition = 3;

	// 省级选项值
	private String[] province = new String[] { "北京", "上海", "天津", "广东" };
	// 地级选项值
	private String[][] city = new String[][] { { "东城区", "西城区", "崇文区" },// 北京
			{ "长宁区", "静安区", "普陀区", "闸北区", "虹口区" },// 上海
			{ "和平区", "河东区", "河西区", "南开区", "河北区", "红桥区", "塘沽区", "汉沽区", "大港区", "东丽区" },// 天津
			{ "广州", "深圳", "韶关" } // 广东
	};

	// 县级选项值
	private String[][][] county = new String[][][] { { { "无" }, { "无" }, { "无" } },// 北京
			{ { "无" }, { "无" }, { "无" }, { "无" }, { "无" } },// 上海
			{ { "无" }, { "无" }, { "无" }, { "无" }, { "无" }, { "无" }, { "无" }, { "无" }, { "无" }, { "无" } },// 天津
			{ { "海珠区", "荔湾区" }, // 广州
					{ "宝安区", "福田区", "龙岗区" }, // 深圳
					{ "武江区", "浈江区", "曲江区", "乐昌市" } // 韶关
			} // 广东
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		setSpinner();
	}

	/*
	 * 设置下拉框
	 */
	private void setSpinner() {
		provinceSpinner = (Spinner) findViewById(R.id.spin_province);
		citySpinner = (Spinner) findViewById(R.id.spin_city);
		countySpinner = (Spinner) findViewById(R.id.spin_county);

		// 绑定适配器和值
		provinceAdapter = new ArrayAdapter<String>(MainActivity.this, R.layout.spiner_item_layout, province);
		provinceSpinner.setAdapter(provinceAdapter);
		provinceSpinner.setSelection(3, true); // 设置默认选中项,此处为默认选中第4个值

		cityAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, city[3]);
		citySpinner.setAdapter(cityAdapter);
		citySpinner.setSelection(0, true); // 默认选中第1个

		countyAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, county[3][0]);
		countySpinner.setAdapter(countyAdapter);
		countySpinner.setSelection(0, true);

		// 省级下拉框监听
		provinceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			// 表示选项被改变的时候触发此方法,主要实现办法:动态改变地级适配器的绑定值
			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
				// position为当前省级选中的值的序号

				// 将地级适配器的值改变为city[position]中的值
				cityAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item,
						city[position]);
				// 设置二级下拉列表的选项内容适配器
				citySpinner.setAdapter(cityAdapter);
				provincePosition = position; // 记录当前省级序号,留给下面修改县级适配器时用
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {

			}

		});

		// 地级下拉监听
		citySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

			@Override
			public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) {
				countyAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item,
						county[provincePosition][position]);
				countySpinner.setAdapter(countyAdapter);
			}

			@Override
			public void onNothingSelected(AdapterView<?> arg0) {

			}
		});
	}
}

activity_main.xml的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="8dp" >

    <FrameLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1" >

        <Spinner
            android:id="@+id/spin_province"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="@null"
            android:gravity="center" />
			<!-- android:background="@null"去掉自带的样式 -->
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|right"
            android:src="@drawable/down_arrow" />
    </FrameLayout>

    <Spinner
        android:id="@+id/spin_city"
        android:layout_width="112dp"
        android:layout_height="wrap_content" />

    <Spinner
        android:id="@+id/spin_county"
        android:layout_width="100dp"
        android:layout_height="wrap_content" />

</LinearLayout>

下拉框的item的布局
spiner_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:minHeight="60dp"
    android:singleLine="true"
    android:textColor="#58c1bb"
    android:textSize="15sp" />

源码下载:
http://download.csdn.net/detail/hjqjl/9185053
gitee上demo:https://gitee.com/hjqjl/WhDemo

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值