添加依赖
compile 'com.contrarywind:Android-PickerView:3.2.5'
添加gson的混淆
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.daiba.wsjr.bean.** { *; }
在main文件夹下创建assets的文件夹用于放保存地址数据的json文件city.json。city.json文件里的内容会附在最后。效果如下。
将json文件里的数据转换成json字符串
public class GetJsonDataUtil {
public String getJson(Context context, String fileName) {
StringBuilder stringBuilder = new StringBuilder();
try {
AssetManager assetManager = context.getAssets();
BufferedReader bf = new BufferedReader(new InputStreamReader(
assetManager.open(fileName)));
String line;
while ((line = bf.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}
承载城市数据
public class CityBean implements IPickerViewData {
/**
* province : 北京
* city_list : ["北京"]
*/
private String province;
private List<String> city_list;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public List<String> getCity_list() {
return city_list;
}
public void setCity_list(List<String> city_list) {
this.city_list = city_list;
}
@Override
public String getPickerViewText() {
return this.province;
}
}
Activity中
private ArrayList<CityBean> options1Items = new ArrayList<>();
private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();
private ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>();
private ArrayList<String> bankNameList = new ArrayList<>();
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;
private boolean isLoaded = false;
private String province;
private String city;
调用
if ( isLoaded ){
ShowPickerView();
}else {
mHandler.sendEmptyMessage(MSG_LOAD_DATA);
}
//判断地址数据是否获取成功
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_LOAD_DATA:
if (thread==null){//如果已创建就不再重新创建子线程了
Log.i("addr","地址数据开始解析");
thread = new Thread(new Runnable() {
@Override
public void run() {
// 写子线程中的操作,解析省市区数据
initJsonData();
}
});
thread.start();
}
break;
case MSG_LOAD_SUCCESS:
Log.i("addr","地址数据获取成功");
isLoaded = true;
ShowPickerView();
break;
case MSG_LOAD_FAILED:
Log.i("addr","地址数据获取失败");
break;
}
}
};
private void initJsonData() {//解析数据
/**
* 注意:assets 目录下的Json文件仅供参考,实际使用可自行替换文件
* 关键逻辑在于循环体
*
* */
String CityData = new GetJsonDataUtil().getJson(this,"city.json");//获取assets目录下的json文件数据
ArrayList<CityBean> jsonBean = parseData(CityData);//用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).getCity_list().size(); c++){//遍历该省份的所有城市
String CityName = jsonBean.get(i).getCity_list().get(c);
CityList.add(CityName);//添加城市
}
/**
* 添加城市数据
*/
options2Items.add(CityList);
}
mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS);
}
public ArrayList<CityBean> parseData(String result) {//Gson 解析
ArrayList<CityBean> detail = new ArrayList<>();
try {
JSONArray data = new JSONArray(result);
Gson gson = new Gson();
for (int i = 0; i < data.length(); i++) {
CityBean entity = gson.fromJson(data.optJSONObject(i).toString(), CityBean.class);
detail.add(entity);
}
} catch (Exception e) {
e.printStackTrace();
mHandler.sendEmptyMessage(MSG_LOAD_FAILED);
}
return detail;
}
private void ShowPickerView() {// 弹出地址选择器
OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() {
@Override
public void onOptionsSelect(int options1, int options2, int options3, View v) {
//返回的分别是三个级别的选中位置
province = options1Items.get(options1).getPickerViewText();
city = options2Items.get(options1).get(options2);
// + options3Items.get(options1).get(options2).get(options3);
MainActivity.province = province;
MainActivity.city = city;
init();
}
})
.setDividerColor(Color.BLACK)
.setTextColorCenter(Color.BLACK) //设置选中项文字颜色
.setContentTextSize(20)
.setOutSideCancelable(false)// default is true
.build();
pvOptions.setPicker(options1Items, options2Items);//二级选择器(市区)
//pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器
pvOptions.show();
}
城市json
[
{
"province": "北京",
"city_list": [
"北京"
]
},
{
"province": "天津",
"city_list": [
"天津"
]
},
{
"province": "河北",
"city_list": [
"石家庄",
"唐山",
"秦皇岛",
"邯郸",
"邢台",
"保定",
"张家口",
"承德",
"沧州",
"廊坊",
"衡水",
"定州",
"辛集"
]
},
{
"province": "山西",
"city_list": [
"太原",
"大同",
"阳泉",
"长治",
"晋城",
"朔州",
"晋中",
"运城",
"忻州",
"临汾",
"吕梁"
]
},
{
"province": "内蒙古",
"city_list": [
"呼和浩特",
"包头",
"乌海",
"赤峰",
"通辽",
"鄂尔多斯",
"呼伦贝尔",
"巴彦淖尔",
"乌兰察布盟",
"兴安盟",
"锡林郭勒盟",
"阿拉善盟"
]
},
{
"province": "辽宁",
"city_list": [
"沈阳",
"大连",
"鞍山",
"抚顺",
"本溪",
"丹东",
"锦州",
"营口",
"阜新",
"辽阳",
"盘锦",
"铁岭",
"朝阳",
"葫芦岛"
]
},
{
"province": "吉林",
"city_list": [
"长春",
"吉林",
"四平",
"辽源",
"通化",
"白山",
"白城",
"松原",
"延边朝鲜族自治州",
"吉林省长白山保护开发区",
"梅河口",
"公主岭"
]
},
{
"province": "黑龙江",
"city_list": [
"哈尔滨",
"齐齐哈尔",
"鸡西",
"鹤岗",
"双鸭山",
"大庆",
"伊春",
"佳木斯",
"七台河",
"牡丹江",
"黑河",
"绥化",
"大兴安岭",
"绥芬河",
"抚远"
]
},
{
"province": "上海",
"city_list": [
"上海"
]
},
{
"province": "江苏",
"city_list": [
"南京",
"无锡",
"徐州",
"常州",
"苏州",
"南通",
"连云港",
"淮安",
"盐城",
"扬州",
"镇江",
"泰州",
"宿迁"
]
},
{
"province": "浙江",
"city_list": [