地址选择器,效果图如下
实现思路
(1)OkHttp发起请求,从html文件获取地址JSON数据
(2)利用三个NumberPicker实现选择
实现代码
- okHttp 发起Get请求, 并且解析JSON数据(利用GSON解析),这里值得注意的是,OkHttp中返回的response.boby.string的有效性只有一次,一旦被调用,就不能再次调用了,取出来是空值(“”)
public class ResourceManager {
List list = new ArrayList();
Callable callable;
public ResourceManager(Callable callable){
this.callable = callable;
getData();
}
public void getData(){
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("http://192.168.0.151:80/1.html")
.build();
//new call
Call call = mOkHttpClient.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e) {
Log.d("wnw", "failure");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//Log.d("wnw", "success" + response.body().string());
parseData(response.body().string()); //response.body().string()调用一次就被清除了,首次有效
}
});
}
private void parseData(String data){
try {
if (data.isEmpty()){
return;
}
JSONObject object = new JSONObject(data);
JSONArray jsonArray = object.getJSONArray("data");
list = formJsonToArray(jsonArray.toString(), new TypeToken>() {
}.getType());
callable.onCall(list);
}catch (Exception e){
e.printStackTrace();
}
}
public static T formJsonToArray(String json, Type t) {
if (json == null) {
return null;
}
return new Gson().fromJson(json, t);
}
interface Callable{
void onCall(List list);
}
}
- 创建Dialog, 并且将三级联动的数据加载到Dialog中
public class PickLocateDialog {
private static String TAG = "PickLocateDialog";
Activity mContext;
NumberPicker mProvicePicker;
NumberPicker mCityPicker;
NumberPicker mDistrictPicker;
List mProvinceList;
private AlertDialog ad;
/**
* 所有省集合
*/
protected String[] mProvinceDatas;
/**
* 所有市的集合
* key - 省 value - 市
*/
protected Map mCitisDatasMap = new HashMap<>();
protected Map mDistrictMap = new HashMap<>();
// protected List
- 实体类
(1)实体类-省份
public class ProvinceModel {
private String id;
private String name;
private List child;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getChild() {
return child;
}
public void setChild(List child) {
this.child = child;
}
}
(2)实体类-城市
public class CityModel {
private String id;
private String name;
private String pid;
private List child;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public List getChild() {
return child;
}
public void setChild(List child) {
this.child = child;
}
}
(3)实体类-区(县)
public class DistrictModel implements Serializable {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public DistrictModel() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- 布局文件