android 省市区联动选择
小工具省市区联动
1、根据本地内置json资源包设置选择
省份资源包下载
2、在activity中的重要代码,解析json状态
private Thread thread;private static final int MSG_LOAD_DATA = 0x0001;private static final int MSG_LOAD_SUCCESS = 0x0002;private static final int MSG_LOAD_FAILED = 0x0003;Handler handler = new Handler(Looper.getMainLooper());@SuppressLint("HandlerLeak")private Handler mHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case MSG_LOAD_DATA:if (thread == null) {thread = new Thread(new Runnable() {@Overridepublic void run() {initJsonData();}});thread.start();}break;case MSG_LOAD_SUCCESS:showSelectDialog();isLoaded = true;break;case MSG_LOAD_FAILED:ToastUtils.showCustomToast(RegistrationActivity.this, "Parse Failed");break;}}};
3、解析json代码
private void initJsonData() {//解析数据/*** 注意:assets 目录下的Json文件仅供参考,实际使用可自行替换文件* 关键逻辑在于循环体** */String JsonData = new GetJsonDataUtil().getJson(this, "province.json");//获取assets目录下的json文件数据ArrayList<JsonBean> jsonBean = parseData(JsonData);//用Gson 转成实体/*** 添加省份数据** 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口,* PickerView会通过getPickerViewText方法获取字符串显示出来。*/options1Items = jsonBean;for (int i = 0; i < jsonBean.size(); i++) {//遍历省份ArrayList<String> cityList = new ArrayList<>();//该省的城市列表(第二级)ArrayList<ArrayList<String>> province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极)for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市String cityName = jsonBean.get(i).getCityList().get(c).getName();cityList.add(cityName);//添加城市ArrayList<String> city_AreaList = new ArrayList<>();//该城市的所有地区列表//如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃/*if (jsonBean.get(i).getCityList().get(c).getArea() == null|| jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {city_AreaList.add("");} else {city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());}*/city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());province_AreaList.add(city_AreaList);//添加该省所有地区数据}/*** 添加城市数据*/options2Items.add(cityList);/*** 添加地区数据*/options3Items.add(province_AreaList);}mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS);}
4、解析初始化完成后,触发按钮可以实现选择
private void showSelectDialog() {OptionsPickerView pvOptions = new OptionsPickerBuilder(RegistrationActivity.this, new OnOptionsSelectListener() {@Overridepublic void onOptionsSelect(int options1, int options2, int options3, View v) {//返回的分别是三个级别的选中位置String opt1tx = options1Items.size() > 0 ?options1Items.get(options1).getPickerViewText() : "";String opt2tx = options2Items.size() > 0&& options2Items.get(options1).size() > 0 ?options2Items.get(options1).get(options2) : "";String opt3tx = options2Items.size() > 0&& options3Items.get(options1).size() > 0&& options3Items.get(options1).get(options2).size() > 0 ?options3Items.get(options1).get(options2).get(options3) : "";String tx = opt1tx + opt2tx + opt3tx;edMerchantArea.setText(tx);
// ToastUtils.showCustomToast(RegistrationActivity.this, tx);}}).setTitleText("城市选择").setDividerColor(Color.BLACK).setTextColorCenter(Color.BLACK) //设置选中项文字颜色.setContentTextSize(20).build();/*pvOptions.setPicker(options1Items);//一级选择器pvOptions.setPicker(options1Items, options2Items);//二级选择器*/pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器pvOptions.show();}
-END