今天没事跟群里面侃大山,有个哥们说道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;@R_419_5565@ java.io.IOException;@R_419_5565@ java.io.inputStream;@R_419_5565@ java.util.HashMap;@R_419_5565@ java.util.Map;@R_419_5565@ kankan.wheel.Widget.OnWheelChangedListener;@R_419_5565@ kankan.wheel.Widget.WheelVIEw;@R_419_5565@ kankan.wheel.Widget.adapters.ArrayWheelAdapter;@R_419_5565@ org.Json.JsONArray;@R_419_5565@ org.Json.JsONException;@R_419_5565@ org.Json.JsONObject;@R_419_5565@ androID.app.Activity;@R_419_5565@ androID.os.Bundle;@R_419_5565@ androID.vIEw.VIEw;@R_419_5565@ 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,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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
总结以上是内存溢出为你收集整理的Android使用android-wheel实现省市县三级联动全部内容,希望文章能够帮你解决Android使用android-wheel实现省市县三级联动所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)