android省市二级联动的实现
因為工作的關系,需要做一個省市二級聯動。
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;// 最重要的參數,選中的城市的cityNoprivate ArrayAdapter<String> proviceAdapter;private ArrayAdapter<String> cityAdapter;Spinner provinceSpinner;Spinner citySpinner;@Overrideprotected 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 blocke.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 blocke.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 blocke.printStackTrace();}}public String[] getCitys(String guid, String jsonData) {/** 此方法用于查找一個省下的所有城市*/// 初始化hashmapcityHash.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 blocke.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;// 省被選擇的監聽器@Overridepublic 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);// 省被選中后,初始化城市SpinnercityAdapter = 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);// 設置默認}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}public ProvinceSelectedListener(Context context) {this.context = context;}}class CitySelectedListener implements OnItemSelectedListener {// 城市被點擊的監聽事件@Overridepublic 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);}}@Overridepublic void onNothingSelected(AdapterView<?> arg0) {// TODO Auto-generated method stub}}}如果有幫到您,打個賞唄
總結
以上是生活随笔為你收集整理的android省市二级联动的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn回退到历史版本
- 下一篇: android录音功能的实现