android-wheel控件实现三级联动效果

本文实例为大家分享了android wheel省市县三级联动效果,供大家参考,具体内容如下

在github上面有一个叫做 Android-wheel 的开源控件, 代码地址:https://github.com/maarek/android-wheel

源码下载地址:http://xiazai.jb51.net/201610/yuanma/AndroidCascadeMaster(jb51.net).rar

主界面布局

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:background="#E9E9E9" android:orientation="vertical" > <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <kankan.wheel.widget.WheelView android:id="@+id/id_province" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" > </kankan.wheel.widget.WheelView> <kankan.wheel.widget.WheelView android:id="@+id/id_city" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" > </kankan.wheel.widget.WheelView> <kankan.wheel.widget.WheelView android:id="@+id/id_district" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" > </kankan.wheel.widget.WheelView> </LinearLayout> <Button android:id="@+id/btn_confirm" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dip" android:gravity="center" android:text="确定" android:textColor="#000000" /> </LinearLayout>

assets资源文件下--province_data.xml(一部分)

<root> <province name="安徽省"> <city name="安庆市"> <district name="枞阳县" zipcode="246000" /> <district name="大观区" zipcode="246000" /> <district name="怀宁县" zipcode="246000" /> <district name="潜山县" zipcode="246000" /> <district name="宿松县" zipcode="246000" /> <district name="太湖县" zipcode="246000" /> <district name="桐城市" zipcode="246000" /> <district name="望江县" zipcode="246000" /> <district name="宜秀区" zipcode="246000" /> <district name="迎江区" zipcode="246000" /> <district name="岳西县" zipcode="246000" /> <district name="其他" zipcode="246000" /> </city>

先看省份、城市、县乡的bean类
ProvinceModel

package com.mrwujay.cascade.model; import java.util.List; public class ProvinceModel { private String name; private List<CityModel> cityList; public ProvinceModel() { super(); } public ProvinceModel(String name, List<CityModel> cityList) { super(); this.name = name; this.cityList = cityList; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<CityModel> getCityList() { return cityList; } public void setCityList(List<CityModel> cityList) { this.cityList = cityList; } @Override public String toString() { return "ProvinceModel [name=" + name + ", cityList=" + cityList + "]"; } }
package com.mrwujay.cascade.model; import java.util.List; public class CityModel { private String name; private List<DistrictModel> districtList; public CityModel() { super(); } public CityModel(String name, List<DistrictModel> districtList) { super(); this.name = name; this.districtList = districtList; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<DistrictModel> getDistrictList() { return districtList; } public void setDistrictList(List<DistrictModel> districtList) { this.districtList = districtList; } @Override public String toString() { return "CityModel [name=" + name + ", districtList=" + districtList + "]"; } }

DistrictModel

package com.mrwujay.cascade.model; public class DistrictModel { private String name; private String zipcode; public DistrictModel() { super(); } public DistrictModel(String name, String zipcode) { super(); this.name = name; this.zipcode = zipcode; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } @Override public String toString() { return "DistrictModel [name=" + name + ", zipcode=" + zipcode + "]"; } }

看自定义的XmlParserHandler

package com.mrwujay.cascade.service; import java.util.ArrayList; import java.util.List; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import com.mrwujay.cascade.model.CityModel; import com.mrwujay.cascade.model.DistrictModel; import com.mrwujay.cascade.model.ProvinceModel; public class XmlParserHandler extends DefaultHandler { /** * 存储所有的解析对象 */ private List<ProvinceModel> provinceList = new ArrayList<ProvinceModel>(); public XmlParserHandler() { } /** * 对外暴露的方法 */ public List<ProvinceModel> getDataList() { return provinceList; } @Override public void startDocument() throws SAXException { // 当读到第一个开始标签的时候,会触发这个方法 } ProvinceModel provinceModel = new ProvinceModel(); CityModel cityModel = new CityModel(); DistrictModel districtModel = new DistrictModel(); /** * <province name="安徽省"> <city name="安庆市"> <district name="枞阳县" zipcode="246000" /> <district name="大观区" zipcode="246000" /> <district name="怀宁县" zipcode="246000" /> <district name="潜山县" zipcode="246000" /> <district name="宿松县" zipcode="246000" /> <district name="太湖县" zipcode="246000" /> <district name="桐城市" zipcode="246000" /> <district name="望江县" zipcode="246000" /> <district name="宜秀区" zipcode="246000" /> <district name="迎江区" zipcode="246000" /> <district name="岳西县" zipcode="246000" /> <district name="其他" zipcode="246000" /> </city> */ @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 当遇到开始标记的时候,调用这个方法 if (qName.equals("province")) { provinceModel = new ProvinceModel(); provinceModel.setName(attributes.getValue(0)); provinceModel.setCityList(new ArrayList<CityModel>()); } else if (qName.equals("city")) { cityModel = new CityModel(); cityModel.setName(attributes.getValue(0)); cityModel.setDistrictList(new ArrayList<DistrictModel>()); } else if (qName.equals("district")) { districtModel = new DistrictModel(); districtModel.setName(attributes.getValue(0)); districtModel.setZipcode(attributes.getValue(1)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // 遇到结束标记的时候,会调用这个方法 if (qName.equals("district")) { cityModel.getDistrictList().add(districtModel); } else if (qName.equals("city")) { provinceModel.getCityList().add(cityModel); } else if (qName.equals("province")) { provinceList.add(provinceModel); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { } }

接下来看基类BaseActivity

package com.mrwujay.cascade.activity; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import android.app.Activity; import android.content.res.AssetManager; import com.mrwujay.cascade.model.CityModel; import com.mrwujay.cascade.model.DistrictModel; import com.mrwujay.cascade.model.ProvinceModel; import com.mrwujay.cascade.service.XmlParserHandler; public class BaseActivity extends Activity { /** * 所有省 */ protected String[] mProvinceDatas; /** * key - 省 value - 市 */ protected Map<String, String[]> mCitisDatasMap = new HashMap<String, String[]>(); /** * key - 市 values - 区 */ protected Map<String, String[]> mDistrictDatasMap = new HashMap<String, String[]>(); /** * key - 区 values - 邮编 */ protected Map<String, String> mZipcodeDatasMap = new HashMap<String, String>(); /** * 当前省的名称 */ protected String mCurrentProviceName; /** * 当前市的名称 */ protected String mCurrentCityName; /** * 当前区的名称 */ protected String mCurrentDistrictName = ""; /** * 当前区的邮政编码 */ protected String mCurrentZipCode = ""; /** * 解析省市区的XML数据 */ protected void initProvinceDatas() { //省份集合列表 List<ProvinceModel> provinceList = null; //获取资源 AssetManager asset = getAssets(); try { //获取输入流 InputStream input = asset.open("province_data.xml"); // 创建一个解析xml的工厂对象 SAXParserFactory spf = SAXParserFactory.newInstance(); // 解析xml SAXParser parser = spf.newSAXParser(); //解析工具 XmlParserHandler handler = new XmlParserHandler(); //进行解析 parser.parse(input, handler); input.close(); // 获取解析出来的数据 provinceList = handler.getDataList(); // */ 初始化默认选中的省、市、区 if (provinceList != null && !provinceList.isEmpty()) { //获取第一个省份 mCurrentProviceName = provinceList.get(0).getName(); List<CityModel> cityList = provinceList.get(0).getCityList(); if (cityList != null && !cityList.isEmpty()) { //获取第一个省份的第一个城市名 mCurrentCityName = cityList.get(0).getName(); List<DistrictModel> districtList = cityList.get(0) .getDistrictList(); //获取第一个省份的第一个城市的第一个县名称 mCurrentDistrictName = districtList.get(0).getName(); mCurrentZipCode = districtList.get(0).getZipcode(); } } // */ mProvinceDatas = new String[provinceList.size()]; for (int i = 0; i < provinceList.size(); i++) { // 遍历所有省的数据 mProvinceDatas[i] = provinceList.get(i).getName(); List<CityModel> cityList = provinceList.get(i).getCityList(); String[] cityNames = new String[cityList.size()]; for (int j = 0; j < cityList.size(); j++) { // 遍历省下面的所有市的数据 cityNames[j] = cityList.get(j).getName(); List<DistrictModel> districtList = cityList.get(j) .getDistrictList(); String[] distrinctNameArray = new String[districtList .size()]; DistrictModel[] distrinctArray = new DistrictModel[districtList .size()]; for (int k = 0; k < districtList.size(); k++) { // 遍历市下面所有区/县的数据 DistrictModel districtModel = new DistrictModel( districtList.get(k).getName(), districtList .get(k).getZipcode()); // 区/县对于的邮编,保存到mZipcodeDatasMap mZipcodeDatasMap.put(districtList.get(k).getName(), districtList.get(k).getZipcode()); distrinctArray[k] = districtModel; distrinctNameArray[k] = districtModel.getName(); } // 市-区/县的数据,保存到mDistrictDatasMap mDistrictDatasMap.put(cityNames[j], distrinctNameArray); } // 省-市的数据,保存到mCitisDatasMap mCitisDatasMap.put(provinceList.get(i).getName(), cityNames); } } catch (Throwable e) { e.printStackTrace(); } finally { } } }

主界面MainActivity

package com.mrwujay.cascade.activity; import com.mrwujay.cascade.R; import com.mrwujay.cascade.R.id; import com.mrwujay.cascade.R.layout; import kankan.wheel.widget.OnWheelChangedListener; import kankan.wheel.widget.WheelView; import kankan.wheel.widget.adapters.ArrayWheelAdapter; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends BaseActivity implements OnClickListener, OnWheelChangedListener { private WheelView mViewProvince; private WheelView mViewCity; private WheelView mViewDistrict; private Button mBtnConfirm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setUpViews(); setUpListener(); setUpData(); } private void setUpViews() { mViewProvince = (WheelView) findViewById(R.id.id_province); mViewCity = (WheelView) findViewById(R.id.id_city); mViewDistrict = (WheelView) findViewById(R.id.id_district); mBtnConfirm = (Button) findViewById(R.id.btn_confirm); } private void setUpListener() { // 添加change事件 mViewProvince.addChangingListener(this); // 添加change事件 mViewCity.addChangingListener(this); // 添加change事件 mViewDistrict.addChangingListener(this); // 添加onclick事件 mBtnConfirm.setOnClickListener(this); } private void setUpData() { initProvinceDatas(); mViewProvince.setViewAdapter(new ArrayWheelAdapter<String>(MainActivity.this, mProvinceDatas)); // 设置可见条目数量 mViewProvince.setVisibleItems(7); mViewCity.setVisibleItems(7); mViewDistrict.setVisibleItems(7); updateCities(); updateAreas(); } /** * 根据当前的省,更新市WheelView的信息 */ private void updateCities() { //获取当前的省份的itme索引值 int pCurrent = mViewProvince.getCurrentItem(); //湖区当前省份名字 mCurrentProviceName = mProvinceDatas[pCurrent]; //获取该省份下面的市数组集合 String[] cities = mCitisDatasMap.get(mCurrentProviceName); if (cities == null) { cities = new String[] { "" }; } mViewCity.setViewAdapter(new ArrayWheelAdapter<String>(this, cities)); mViewCity.setCurrentItem(0); updateAreas(); } /** * 根据当前的市,更新区WheelView的信息 */ private void updateAreas() { int pCurrent = mViewCity.getCurrentItem(); mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent]; String[] areas = mDistrictDatasMap.get(mCurrentCityName); if (areas == null) { areas = new String[] { "" }; } mViewDistrict.setViewAdapter(new ArrayWheelAdapter<String>(this, areas)); mViewDistrict.setCurrentItem(0); } /** * 实现接口方法的回调 */ @Override public void onChanged(WheelView wheel, int oldValue, int newValue) { // TODO Auto-generated method stub if (wheel == mViewProvince) { updateCities(); } else if (wheel == mViewCity) { updateAreas(); } else if (wheel == mViewDistrict) { //获取县的名字 mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[newValue]; //获取县的编码 mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_confirm: showSelectedResult(); break; default: break; } } private void showSelectedResult() { Toast.makeText(MainActivity.this, "当前选中:"+mCurrentProviceName+","+mCurrentCityName+"," +mCurrentDistrictName+","+mCurrentZipCode, Toast.LENGTH_SHORT).show(); } }

还有2个drawable
wheel_bg.xml

<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> </layer-list>

wheel_val.xml

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:angle="90" android:centerColor="#70222222" android:endColor="#70EEEEEE" android:startColor="#70222222" /> <stroke android:width="20dp" android:color="#FF69B4" /> </shape>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-27 14:16:03

android-wheel控件实现三级联动效果的相关文章

android-wheel控件实现三级联动效果_Android

本文实例为大家分享了android wheel省市县三级联动效果,供大家参考,具体内容如下 在github上面有一个叫做 Android-wheel 的开源控件, 代码地址:https://github.com/maarek/android-wheel 源码下载地址:http://xiazai.jb51.net/201610/yuanma/AndroidCascadeMaster(jb51.net).rar 主界面布局 activity_main.xml <LinearLayout xmlns:

一个Demo让你掌握Android所有控件

原文:一个Demo让你掌握Android所有控件 本文是转载收藏,侵删,出处:"安卓巴士"       下面给出实现各个组件的源代码: 1.下拉框实现--Spinner [java] view plaincopyprint? package com.cellcom;      import java.util.ArrayList;   import java.util.List;      import android.app.Activity;   import android.os

android 控件-android:这个控件叫什么,怎么实现的呢?

问题描述 android:这个控件叫什么,怎么实现的呢? 50C 如题,哪位朋友会呢,帮忙下吧,谢谢了. 解决方案 Android控件倒计时的实现Android 实现控件浮动效果Android Studio中Spinner控件的数据绑定实现 解决方案二: 自定义的 自定义的 自定义的 解决方案三: http://www.javaapk.com/source/6640.html,这个是仿乐动力体重设计例子,拿过来改改是可以的 解决方案四: 能说的清楚一点吗?比如这个控件有什么效果 解决方案五: 应

Android UI控件ExpandableListView基本用法详解_Android

ExpandableListView介绍  ExpandableListView的引入  ExpandableListView可以显示一个视图垂直滚动显示两级列表中的条目,这不同于列表视图(ListView).ExpandableListView允许有两个层次:一级列表中有二级列表.  比如在手机设置中,对于分类,有很好的效果.手机版QQ也是这样的效果.   使用ExpandableListView的整体思路  (1)给ExpandableListView设置适配器,那么必须先设置数据源.  (

Android重要控件SnackBar使用方法详解_Android

SnackBar是DesignSupportLibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是SnackBar允许用户向右滑动消除它,同时,也允许在SnackBar中设定一个Action,当用户点击了SnackBar里面的按钮的时候,可以进行一些操作,所以,功能绝对是很强大的.  SnackBar的构造:  // 参数分别是父容器,提示信息,持续时间public static Snackbar make(@NonNull View view, @NonNu

Android组合控件实现功能强大的自定义控件_Android

通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 上文说过了如何继承现有控件来自定义控件:<Android继承现有控件拓展实现自定义控件textView>,这节我们来讨论第二个议题.怎么将控件组合来实现一个功能强大的自定义控件. 先看看创建组合控件的好处吧,创建组合控件能够很好的创建具有组合功能的控件集合.那我们一般又是怎么做的了,一般我们来继承一个合适的ViewG

Android GridView控件自定义

虽然Android已自带了GridView,但是,却不够灵活,同时也不能自由添加控件,因此,本人通过需要进一步封装,来实现Android自定义GridView控件,达到自己需要的效果. 我们看一下最终所需要的效果图: 说明: 上图:这里先省去分页,只讲:Android GridView 控件实现自定义. 按照上面的图例需求,大致上可以把Android GridView 画成如下的方式: 思路如下: 默认将我们的组合控件设置为Orientation 是VERTICAL. 首先一行五个,那么一行以一

android基本控件ToggleButton&amp;Switch使用指南_Android

ToggleButton(开关按钮)和Switch(开关)讲解: 一.核心属性讲解: (1)ToggleButton textOn:按钮被选中的时候文字显示 textOff:按钮没有被选中的时候文字显示 ToggleButton的状态只能是选中和未选中,并且需要为不同的状态设置不同的显示文本. 以下案例为ToggleButton的用法 目录结构 main.xml布局文件 <?xml version="1.0" encoding="utf-8"?> <

自定义控件-android 可旋转控件

问题描述 android 可旋转控件 我试过 在ondraw 里面 用 canvas.rotate 方法 然后自己写一个 setOrientation方法 调用 ondraw方法 但是刷新时间 还有效果 都不是很好.谁能给一个 android 自定义 可旋转的控件 可以动态旋转 的那种. 解决方案 我以前写过一个旋转按钮控件,是用区间进行判断的,你可以借鉴一下: enter code hpackage jxt.app.radio.view; import jxt.app.radio.R;impo