package com.example.administrator.coolweather;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import com.example.administrator.coolweather.db.City;
import com.example.administrator.coolweather.db.County;
import com.example.administrator.coolweather.db.Province;
import com.example.administrator.coolweather.util.HttpUtil;
import com.example.administrator.coolweather.util.Utility;import org.litepal.crud.DataSupport;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;/**
* Created by Administrator on 2018/4/24.
*/public class ChooseAreaFragment extends Fragment {
public static final int LEVEL_PROVINCE=0;
public static final int LEVEL_CITY=1;
public static final int LEVEL_COUNTY=2;
private ProgressDialog progressDialog;
private TextView titleText;
private Button backButton; private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> dataList=new ArrayList<>(); private List<Province> provinceList;
private List<City> cityList;
private List<County> countyList; private Province selectedProvince;
private City selectedCity;
//当前选中的级别
private int currentLevel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
View view=inflater.inflate(R.layout.choose_area,container,false);
titleText=(TextView)view.findViewById(R.id.title_text);
backButton=(Button)view.findViewById(R.id.back_button);
listView=(ListView)view.findViewById(R.id.list_view);
adapter=new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1,dataList);
listView.setAdapter(adapter);
return view;
} @Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
if(currentLevel==LEVEL_PROVINCE){
selectedProvince=provinceList.get(position);
queryCities();
}else if(currentLevel==LEVEL_CITY){
selectedCity=cityList.get(position);
queryCounties();
}
}
});
backButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(currentLevel==LEVEL_COUNTY){
queryCities();
}else if(currentLevel==LEVEL_CITY){
queryProvinces();
}
}
});
queryProvinces();
} /*
查询全国所有的省,先从数据库查询,如果没有查询到再去服务器上查询
放到ListView中
*/
private void queryProvinces(){
titleText.setText("中国");
backButton.setVisibility(View.GONE);
provinceList= DataSupport.findAll(Province.class);
if(provinceList.size()>0){
dataList.clear();
for(Province province:provinceList){
dataList.add(province.getProvinceName()+" "+province.getProvinceCode()+" "+province.getId());
}
adapter.notifyDataSetChanged();
listView.setSelection(0);
currentLevel=LEVEL_PROVINCE;
}else{
String address="http://guolin.tech/api/china";
queryFromServer(address,"province");
}
} /*
查询选中省内所有的市,优先从数据库查询,如果没有查询到再到服务器上查询
放到ListView中
*/
private void queryCities(){
titleText.setText(selectedProvince.getProvinceName());
backButton.setVisibility(View.VISIBLE);
cityList=DataSupport.where("provinceid = ?",String.valueOf(selectedProvince.getId())).find(City.class);
if(cityList.size()>0){
dataList.clear();
for(City city:cityList){
dataList.add(city.getCityName()+" "+city.getCityCode()+" "+city.getProvinceId());
}
adapter.notifyDataSetChanged();
listView.setSelection(0);
currentLevel=LEVEL_CITY;
}else{
int provinceCode=selectedProvince.getProvinceCode();
String address="http://guolin.tech/api/china/"+provinceCode;
queryFromServer(address,"city");
}
} /*
查询市内所有的县,优先从数据库查询,如果没有查询到再去服务器上查询
放到ListView中
*/
private void queryCounties(){
titleText.setText(selectedCity.getCityName());
backButton.setVisibility(View.VISIBLE);
countyList=DataSupport.where("cityid = ?",String.valueOf(selectedCity.getId())).find(County.class);
if(countyList.size()>0){
dataList.clear();
for(County county:countyList){
dataList.add(county.getCountyName());
}
adapter.notifyDataSetChanged();
listView.setSelection(0);
currentLevel=LEVEL_COUNTY;
}else{
int provinceCode=selectedProvince.getProvinceCode();
int cityCode=selectedCity.getCityCode();
String address="http://guolin.tech/api/china/"+provinceCode+"/"+cityCode;
queryFromServer(address,"county");
}
}
/*
根据传入的地址和类型从服务器上查询数据
*/
private void queryFromServer(String address,final String type){
showProgressDialog();
HttpUtil.sendOkHttpRequest(address,new Callback(){
@Override
public void onResponse(Call call,Response response)throws IOException{
String responseText=response.body().toString();
boolean result=false;
//如果配对,把从服务器查询到的JSON数据配对到数据库中
if("province".equals(type)){
result= Utility.handleProvinceResponse(responseText);
}else if("city".equals(type)){
result=Utility.handleCityResponse(responseText,selectedProvince.getId());
}else if("county".equals(type)){
result=Utility.handleCountyResponse(responseText,selectedCity.getId());
}
if(result){
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
closeProgressDialog();
//从数据库中查询所有的省,放到ListView中
if("province".equals(type)){
queryProvinces();
}else if("city".equals(type)){
queryCities();
}else if("county".equals(type)){
queryCounties();
}
}
});
}
} @Override
public void onFailure(Call call,IOException e){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
closeProgressDialog();
Toast.makeText(getContext(),"加载失败",Toast.LENGTH_SHORT).show();
}
});
}
});
} /*
显示进度对话框
*/
private void showProgressDialog(){
if(progressDialog==null){
progressDialog=new ProgressDialog(getActivity());
progressDialog.setMessage("正在加载...");
progressDialog.setCanceledOnTouchOutside(false);
}
progressDialog.show();
} /*
关闭进度对话框
*/
private void closeProgressDialog(){
if(progressDialog!=null){
progressDialog.dismiss();
}
}
}
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v4.app.Fragment;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;import com.example.administrator.coolweather.db.City;
import com.example.administrator.coolweather.db.County;
import com.example.administrator.coolweather.db.Province;
import com.example.administrator.coolweather.util.HttpUtil;
import com.example.administrator.coolweather.util.Utility;import org.litepal.crud.DataSupport;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;/**
* Created by Administrator on 2018/4/24.
*/public class ChooseAreaFragment extends Fragment {
public static final int LEVEL_PROVINCE=0;
public static final int LEVEL_CITY=1;
public static final int LEVEL_COUNTY=2;
private ProgressDialog progressDialog;
private TextView titleText;
private Button backButton; private ListView listView;
private ArrayAdapter<String> adapter;
private List<String> dataList=new ArrayList<>(); private List<Province> provinceList;
private List<City> cityList;
private List<County> countyList; private Province selectedProvince;
private City selectedCity;
//当前选中的级别
private int currentLevel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){
View view=inflater.inflate(R.layout.choose_area,container,false);
titleText=(TextView)view.findViewById(R.id.title_text);
backButton=(Button)view.findViewById(R.id.back_button);
listView=(ListView)view.findViewById(R.id.list_view);
adapter=new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1,dataList);
listView.setAdapter(adapter);
return view;
} @Override
public void onActivityCreated(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent,View view,int position,long id){
if(currentLevel==LEVEL_PROVINCE){
selectedProvince=provinceList.get(position);
queryCities();
}else if(currentLevel==LEVEL_CITY){
selectedCity=cityList.get(position);
queryCounties();
}
}
});
backButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if(currentLevel==LEVEL_COUNTY){
queryCities();
}else if(currentLevel==LEVEL_CITY){
queryProvinces();
}
}
});
queryProvinces();
} /*
查询全国所有的省,先从数据库查询,如果没有查询到再去服务器上查询
放到ListView中
*/
private void queryProvinces(){
titleText.setText("中国");
backButton.setVisibility(View.GONE);
provinceList= DataSupport.findAll(Province.class);
if(provinceList.size()>0){
dataList.clear();
for(Province province:provinceList){
dataList.add(province.getProvinceName()+" "+province.getProvinceCode()+" "+province.getId());
}
adapter.notifyDataSetChanged();
listView.setSelection(0);
currentLevel=LEVEL_PROVINCE;
}else{
String address="http://guolin.tech/api/china";
queryFromServer(address,"province");
}
} /*
查询选中省内所有的市,优先从数据库查询,如果没有查询到再到服务器上查询
放到ListView中
*/
private void queryCities(){
titleText.setText(selectedProvince.getProvinceName());
backButton.setVisibility(View.VISIBLE);
cityList=DataSupport.where("provinceid = ?",String.valueOf(selectedProvince.getId())).find(City.class);
if(cityList.size()>0){
dataList.clear();
for(City city:cityList){
dataList.add(city.getCityName()+" "+city.getCityCode()+" "+city.getProvinceId());
}
adapter.notifyDataSetChanged();
listView.setSelection(0);
currentLevel=LEVEL_CITY;
}else{
int provinceCode=selectedProvince.getProvinceCode();
String address="http://guolin.tech/api/china/"+provinceCode;
queryFromServer(address,"city");
}
} /*
查询市内所有的县,优先从数据库查询,如果没有查询到再去服务器上查询
放到ListView中
*/
private void queryCounties(){
titleText.setText(selectedCity.getCityName());
backButton.setVisibility(View.VISIBLE);
countyList=DataSupport.where("cityid = ?",String.valueOf(selectedCity.getId())).find(County.class);
if(countyList.size()>0){
dataList.clear();
for(County county:countyList){
dataList.add(county.getCountyName());
}
adapter.notifyDataSetChanged();
listView.setSelection(0);
currentLevel=LEVEL_COUNTY;
}else{
int provinceCode=selectedProvince.getProvinceCode();
int cityCode=selectedCity.getCityCode();
String address="http://guolin.tech/api/china/"+provinceCode+"/"+cityCode;
queryFromServer(address,"county");
}
}
/*
根据传入的地址和类型从服务器上查询数据
*/
private void queryFromServer(String address,final String type){
showProgressDialog();
HttpUtil.sendOkHttpRequest(address,new Callback(){
@Override
public void onResponse(Call call,Response response)throws IOException{
String responseText=response.body().toString();
boolean result=false;
//如果配对,把从服务器查询到的JSON数据配对到数据库中
if("province".equals(type)){
result= Utility.handleProvinceResponse(responseText);
}else if("city".equals(type)){
result=Utility.handleCityResponse(responseText,selectedProvince.getId());
}else if("county".equals(type)){
result=Utility.handleCountyResponse(responseText,selectedCity.getId());
}
if(result){
getActivity().runOnUiThread(new Runnable(){
@Override
public void run(){
closeProgressDialog();
//从数据库中查询所有的省,放到ListView中
if("province".equals(type)){
queryProvinces();
}else if("city".equals(type)){
queryCities();
}else if("county".equals(type)){
queryCounties();
}
}
});
}
} @Override
public void onFailure(Call call,IOException e){
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
closeProgressDialog();
Toast.makeText(getContext(),"加载失败",Toast.LENGTH_SHORT).show();
}
});
}
});
} /*
显示进度对话框
*/
private void showProgressDialog(){
if(progressDialog==null){
progressDialog=new ProgressDialog(getActivity());
progressDialog.setMessage("正在加载...");
progressDialog.setCanceledOnTouchOutside(false);
}
progressDialog.show();
} /*
关闭进度对话框
*/
private void closeProgressDialog(){
if(progressDialog!=null){
progressDialog.dismiss();
}
}
}
import com.example.administrator.coolweather.db.County;
import com.example.administrator.coolweather.db.Province;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;/**
* Created by Administrator on 2018/4/24.
*/public class Utility { /**
* 解析和处理服务器返回的省级数据
*/
public static boolean handleProvinceResponse(String response) {
if (!TextUtils.isEmpty(response)) {
try {
JSONArray allProvinces = new JSONArray(response);
for (int i = 0; i < allProvinces.length(); i++) {
JSONObject provinceObject = allProvinces.getJSONObject(i);
Province province = new Province();
province.setProvinceName(provinceObject.getString("name"));
province.setProvinceCode(provinceObject.getInt("id"));
province.save();
}
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
} /**
* 解析和处理服务器返回的市级数据
*/
public static boolean handleCityResponse(String response, int provinceId) {
if (!TextUtils.isEmpty(response)) {
try {
JSONArray allCities = new JSONArray(response);
for (int i = 0; i < allCities.length(); i++) {
JSONObject cityObject = allCities.getJSONObject(i);
City city = new City();
city.setCityName(cityObject.getString("name"));
city.setCityCode(cityObject.getInt("id"));
city.setProvinceId(provinceId);
city.save();
}
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
} /**
* 解析和处理服务器返回的县级数据
*/
public static boolean handleCountyResponse(String response, int cityId) {
if (!TextUtils.isEmpty(response)) {
try {
JSONArray allCounties = new JSONArray(response);
for (int i = 0; i < allCounties.length(); i++) {
JSONObject countyObject = allCounties.getJSONObject(i);
County county = new County();
county.setCountyName(countyObject.getString("name"));
county.setWeatherId(countyObject.getString("weather_id"));
county.setCityId(cityId);
county.save();
}
return true;
} catch (JSONException e) {
e.printStackTrace();
}
}
return false;
}
}
package com.example.administrator.coolweather.util;import okhttp3.OkHttpClient;
import okhttp3.Request;/**
* Created by Administrator on 2018/4/24.
*/public class HttpUtil {
public static void sendOkHttpRequest(String address,okhttp3.Callback callback){
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(address).build();
client.newCall(request).enqueue(callback);
}
}
下载下来的chapter14这个文件夹就是你这个项目