因为工作的关系,需要做一个省市二级联动。
1、首先,实现这个功能所用到的控件是android 的spinner
2、要做一个省市二级联动,首先我们要有所有省及其主要城市的数据,这里我给一个我的百度云的链接。大家可以自行前去下载
3、下面是我对该资料,及省市二级联动实现的分析
二级联动思路整理
这个json数据太大了,不能每次都循环遍历所有数据
1首先要获得省的列表
在json数据中,所有fGuid的值都为0,可以根据这个得到所有的省的列表。可以只解析前34个json数据的值(省的信息排在该json的前面,34已经足够将所有的省的信息获取到),可以有效的减少程序运行
2将省的信息放入spinner中
3省被选择后要获得城市的信息
城市的fGuid的值都不为空,fGuid的值代表的是城市所属的省,他的值是省的Guid的值。所以,所有省的Guid值都必须被保存
这时判断json中的fGuid就可以得出所有该省城市的数据
同一个省的城市在该json数据中都是连续的。当找到一个属于该省的程序后,如果连续出现五个不属于该省的城市,查找停止。
4用户点击所选城市时,所需要的最终数据是cityNo其他都是不用的。所以,要抽取出来的数据就是cityName(用于spinner显示),cityNo 实际要用的数据
总结: 省需要获取的信息是省的cityName(用于spinner显示)、guid(用于查找该省下的城市)
城市需要获得的信息是cityName(用于spinner显示)、cityNo
4以下是我实现二级联动的代码
package com.zhiyinqing;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
public class MainActivity extends Activity {
HashMap<String, String> provinceHash = new HashMap<String, String>();
String[] provinceString = new String[34];
HashMap<String, String> cityHash = new HashMap<String, String>();
String[] cityString;
String file;
String cityNo = null;// 最重要的参数,选中的城市的cityNo
private ArrayAdapter<String> proviceAdapter;
private ArrayAdapter<String> cityAdapter;
Spinner provinceSpinner;
Spinner citySpinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
provinceSpinner = (Spinner) findViewById(R.id.spinnerprovince);
citySpinner = (Spinner) findViewById(R.id.spinnercity);
file = readFile(); // 读取txt文件
getProvinces(file); // 得到省的列表
// 设置spinner,不用管什么作用
proviceAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, provinceString);
proviceAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置下拉风格
provinceSpinner.setAdapter(proviceAdapter); // 将adapter 添加到spinner中
provinceSpinner.setOnItemSelectedListener(new ProvinceSelectedListener(
MainActivity.this));// 添加监听
provinceSpinner.setVisibility(View.VISIBLE);// 设置默认值
}
public String readFile() {
/*
* 读取文件中数据的方法
*/
InputStream myFile = null;
myFile = getResources().openRawResource(R.raw.ub_city);
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(myFile, "utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("debug", e.toString());
}
String temp;
String str = "";
try {
while ((temp = br.readLine()) != null) {
str = str + temp;
// Log.i("zhiyinqing", "断点3"+temp);
}
br.close();
myFile.close();
return str;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "error";
}
}
public void getProvinces(String jsonData) {
/*
* 从json字符串中得到省的信息
*/
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(jsonData);
for (int i = 0; i < 34; i++) {
// 获取了34个省市区信息
JSONObject jsonObject = jsonArray.getJSONObject(i);
String guid = jsonObject.getString("guid");
String cityName = jsonObject.getString("cityName");
// Log.i("zhiyinqing", i+guid+cityName);
provinceHash.put(cityName, guid);
provinceString[i] = cityName;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String[] getCitys(String guid, String jsonData) {
/*
* 此方法用于查找一个省下的所有城市
*/
// 初始化hashmap
cityHash.clear();
// 暂时存放城市的数组
String[] cityBuffer = new String[21];
int j = 0;
// 解析数据
JSONArray jsonArray;
try {
jsonArray = new JSONArray(jsonData);
int length = jsonArray.length();
int i = 33;
int continuous = 0;// 这个变量用于判断是否连续几次没有找到,如果是,则该省信息全部找到了
boolean isFind = false;
while (i < length) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String fGuid = jsonObject.getString("fGuid");
String cityName = jsonObject.getString("cityName");
String cityNo = jsonObject.getString("cityNo");
if (fGuid.equals(guid)) {
isFind = true;
cityHash.put(cityName, cityNo);
cityBuffer[j] = cityName;
j++;
// Log.i("zhiyinqing", cityName);
} else {
if (isFind == true) {
continuous += 1;
if (continuous > 5) {
Log.i("zhiyinqing", "城市数:" + j);
break;
}
}
}
i++;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String[] citys = new String[j];
for(int i=0;i<j;i++){
citys[i] = cityBuffer[i];
}
return citys;
}
class ProvinceSelectedListener implements OnItemSelectedListener {
Context context;
// 省被选择的监听器
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String provinceName = provinceString[arg2];
Toast.makeText(context, provinceName, Toast.LENGTH_LONG).show();
String guid = provinceHash.get(provinceName);
cityString = getCitys(guid, file);
// 省被选中后,初始化城市Spinner
cityAdapter = new ArrayAdapter<String>(context,
android.R.layout.simple_spinner_item, cityString);
cityAdapter
.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置下拉风格
citySpinner.setAdapter(cityAdapter); // 将adapter 添加到spinner中
citySpinner.setOnItemSelectedListener(new CitySelectedListener());// 添加监听
citySpinner.setVisibility(View.VISIBLE);// 设置默认
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
public ProvinceSelectedListener(Context context) {
this.context = context;
}
}
class CitySelectedListener implements OnItemSelectedListener {
// 城市被点击的监听事件
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
String cityName = cityString[arg2];
if (cityName.equals("") || cityName == null) {
cityName = cityString[0];
cityNo = cityHash.get(cityName);
} else {
cityNo = cityHash.get(cityName);
Log.i("zhiyinqing", "cityNo" + cityNo);
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
}
如果有帮到您,打个赏呗