Android使用android-wheel实现省市县三级联动
程序员文章站
2024-03-06 15:55:56
今天没事跟群里面侃大山,有个哥们说道android wheel这个控件,以为是andriod内置的控件,google一把,发现是个github上的一个控件。
下载地址:h...
今天没事跟群里面侃大山,有个哥们说道android wheel这个控件,以为是andriod内置的控件,google一把,发现是个github上的一个控件。
下载地址:https://code.google.com/p/android-wheel/ 发现很适合做省市县三级联动就做了一个。
先看下效果图:
1、首先导入github上的wheel项目
2、新建个项目,然后选择记得右键->properties->android中将wheel添加为lib:
上面两个步骤是导入所有开源项目的过程了。
3、下面开始代码的编写:首先是省市区的json文件,放置在asserts的city.json中:
大概的格式先了解一下,一会代码会根据这样的格式解析
{"citylist": [{"p":"河北", "c":[{"n":"石家庄", "a":[{"s":"长安区"},{"s":"桥东区"},{"s":"鹿泉市"}] }] }
4、布局文件,比较简单就3个wheelview分别代表省,市,县,还有一个按钮:
<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="match_parent" android:background="#000000" android:orientation="vertical" > <textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_margin="10dp" android:text="请选择城市" android:textcolor="#ffffff" android:textsize="20sp" /> <linearlayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/layout_bg" 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_area" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" > </kankan.wheel.widget.wheelview> </linearlayout> <button android:onclick="showchoose" android:layout_gravity="right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确定" /> </linearlayout>
5、activity的编写:注释相当详细,节不赘述了。
package com.example.wheel_province; import java.io.ioexception; import java.io.inputstream; import java.util.hashmap; import java.util.map; import kankan.wheel.widget.onwheelchangedlistener; import kankan.wheel.widget.wheelview; import kankan.wheel.widget.adapters.arraywheeladapter; import org.json.jsonarray; import org.json.jsonexception; import org.json.jsonobject; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.toast; /** * * @author zhy * */ public class citiesactivity extends activity implements onwheelchangedlistener { /** * 把全国的省市区的信息以json的格式保存,解析完成后赋值为null */ private jsonobject mjsonobj; /** * 省的wheelview控件 */ private wheelview mprovince; /** * 市的wheelview控件 */ private wheelview mcity; /** * 区的wheelview控件 */ private wheelview marea; /** * 所有省 */ private string[] mprovincedatas; /** * key - 省 value - 市s */ private map<string, string[]> mcitisdatasmap = new hashmap<string, string[]>(); /** * key - 市 values - 区s */ private map<string, string[]> mareadatasmap = new hashmap<string, string[]>(); /** * 当前省的名称 */ private string mcurrentprovicename; /** * 当前市的名称 */ private string mcurrentcityname; /** * 当前区的名称 */ private string mcurrentareaname =""; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.citys); initjsondata(); mprovince = (wheelview) findviewbyid(r.id.id_province); mcity = (wheelview) findviewbyid(r.id.id_city); marea = (wheelview) findviewbyid(r.id.id_area); initdatas(); mprovince.setviewadapter(new arraywheeladapter<string>(this, mprovincedatas)); // 添加change事件 mprovince.addchanginglistener(this); // 添加change事件 mcity.addchanginglistener(this); // 添加change事件 marea.addchanginglistener(this); mprovince.setvisibleitems(5); mcity.setvisibleitems(5); marea.setvisibleitems(5); updatecities(); updateareas(); } /** * 根据当前的市,更新区wheelview的信息 */ private void updateareas() { int pcurrent = mcity.getcurrentitem(); mcurrentcityname = mcitisdatasmap.get(mcurrentprovicename)[pcurrent]; string[] areas = mareadatasmap.get(mcurrentcityname); if (areas == null) { areas = new string[] { "" }; } marea.setviewadapter(new arraywheeladapter<string>(this, areas)); marea.setcurrentitem(0); } /** * 根据当前的省,更新市wheelview的信息 */ private void updatecities() { int pcurrent = mprovince.getcurrentitem(); mcurrentprovicename = mprovincedatas[pcurrent]; string[] cities = mcitisdatasmap.get(mcurrentprovicename); if (cities == null) { cities = new string[] { "" }; } mcity.setviewadapter(new arraywheeladapter<string>(this, cities)); mcity.setcurrentitem(0); updateareas(); } /** * 解析整个json对象,完成后释放json对象的内存 */ private void initdatas() { try { jsonarray jsonarray = mjsonobj.getjsonarray("citylist"); mprovincedatas = new string[jsonarray.length()]; for (int i = 0; i < jsonarray.length(); i++) { jsonobject jsonp = jsonarray.getjsonobject(i);// 每个省的json对象 string province = jsonp.getstring("p");// 省名字 mprovincedatas[i] = province; jsonarray jsoncs = null; try { /** * throws jsonexception if the mapping doesn't exist or is * not a jsonarray. */ jsoncs = jsonp.getjsonarray("c"); } catch (exception e1) { continue; } string[] mcitiesdatas = new string[jsoncs.length()]; for (int j = 0; j < jsoncs.length(); j++) { jsonobject jsoncity = jsoncs.getjsonobject(j); string city = jsoncity.getstring("n");// 市名字 mcitiesdatas[j] = city; jsonarray jsonareas = null; try { /** * throws jsonexception if the mapping doesn't exist or * is not a jsonarray. */ jsonareas = jsoncity.getjsonarray("a"); } catch (exception e) { continue; } string[] mareasdatas = new string[jsonareas.length()];// 当前市的所有区 for (int k = 0; k < jsonareas.length(); k++) { string area = jsonareas.getjsonobject(k).getstring("s");// 区域的名称 mareasdatas[k] = area; } mareadatasmap.put(city, mareasdatas); } mcitisdatasmap.put(province, mcitiesdatas); } } catch (jsonexception e) { e.printstacktrace(); } mjsonobj = null; } /** * 从assert文件夹中读取省市区的json文件,然后转化为json对象 */ private void initjsondata() { try { stringbuffer sb = new stringbuffer(); inputstream is = getassets().open("city.json"); int len = -1; byte[] buf = new byte[1024]; while ((len = is.read(buf)) != -1) { sb.append(new string(buf, 0, len, "gbk")); } is.close(); mjsonobj = new jsonobject(sb.tostring()); } catch (ioexception e) { e.printstacktrace(); } catch (jsonexception e) { e.printstacktrace(); } } /** * change事件的处理 */ @override public void onchanged(wheelview wheel, int oldvalue, int newvalue) { if (wheel == mprovince) { updatecities(); } else if (wheel == mcity) { updateareas(); } else if (wheel == marea) { mcurrentareaname = mareadatasmap.get(mcurrentcityname)[newvalue]; } } public void showchoose(view view) { toast.maketext(this, mcurrentprovicename + mcurrentcityname + mcurrentareaname, 1).show(); } }
源码下载:http://xiazai.jb51.net/201608/yuanma/androidwheel(jb51.net).rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。