今天我们来说一个非常好用的框架PickerView,来完成地址选择器的功能。还是老原则不好用,不推荐。先上个效果图。
1.首先我们来做准备工作。
添加依赖
compile 'com.contrarywind:Android-PickerView:3.2.5'
//里面有用到gson,如果原来项目中有无需添加gson
compile 'com.google.code.gson:gson:2.3.1'
添加gson的混淆
##---------------Begin: proguard configuration for Gson ----------
# Gson 代码混淆
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.daiba.wsjr.bean.** { *; }
##---------------End: proguard configuration for Gson ----------
在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;
}
}
然后我们切入正题,先做好声明,省的你们粘完代码报错了,又说我都是按你的写的啊怎么报错呢?┭┮﹏┭┮
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;
private TextView bank_addr;
因为我们要加载json文件中的数据,这属于耗时操作需要一个子线程,数据加载完毕才能让选择器展示数据。这里免我们用到了Handle解决这个问题。
(往方法区粘就行)
//判断地址数据是否获取成功
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