Android省市區三級聯動

1.      首先非常感謝鴻洋,大神是CSDN上我非常敬仰開發工程師。我是在大神提供的demo基礎上稍稍改動一下就達到我自己想要的效果

2.      我的省市區實現的是能夠動態修改自定義控件的數據,非常簡單就是你需要什麼信息傳遞什麼信息,數據就能改動,直接拷貝到自己的項目中就能用

3.      部分關鍵代碼,完整的代碼自行下載使用

1)     解析json數據

private void initJsonData1() {
		try {
			StringBuffer sb = new StringBuffer();
			InputStream is = getAssets().open("area.json");
			int len = -1;
			byte[] buf = new byte[1024];
			while ((len = is.read(buf)) != -1) {
				sb.append(new String(buf, 0, len, "utf-8"));
			}
			is.close();
			mJsonObj1 = new JSONArray(sb.toString());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
	}

2)     加載解析的省市區數據

private void initJson() {

		try {
			for (int i = 0; i < mJsonObj1.length(); i++) {
				JSONObject jsonP = mJsonObj1.getJSONObject(i);// 每個省的json對象
				String province = jsonP.getString("name");
				String cityList = jsonP.getString("cityList");
				// Log.i("province", province);
				provinceshuzu.add(province);
				array1 = (String[]) provinceshuzu.toArray(new String[provinceshuzu.size()]);
				// Log.i("provinceshuzu1", ""+Arrays.asList(array1));
				JSONArray array = new JSONArray(cityList);
				for (int k = 0; k < array.length(); k++) {
					JSONObject jsonC = array.getJSONObject(k);// 每個省的json對象
					city = jsonC.getString("name");
					areaList = jsonC.getString("areaList");
					name = areaList.substring(1, areaList.length() - 1);
					name1 = name.replace("\"", "");
					name2 = name1.replace("\",", ",");
					name3 = name2.split(",");
					// Log.i("5555559999", ""+Arrays.asList(name3));
					if (province.equals("北京")) {
						cityshuzu.add("京" + city);
						mAreaDatasMap1.put("京" + city, name3);
					} else if (province.equals("天津")) {
						cityshuzu.add("津" + city);
						mAreaDatasMap1.put("津" + city, name3);
					} else if (province.equals("上海")) {
						cityshuzu.add("滬" + city);
						mAreaDatasMap1.put("滬" + city, name3);
					} else {
						cityshuzu.add(city);
						mAreaDatasMap1.put(city, name3);
					}
					array2 = (String[]) cityshuzu.toArray(new String[cityshuzu.size()]);
					// Log.i("9999", ""+Arrays.asList(array2));

				}
				cityshuzu.clear();

				mCitisDatasMap1.put(province, array2);
			}
		} catch (Exception e) {
		}
		mJsonObj1 = null;
	}

3)     根據當前的省更新市

private void updateCities() {
		int pCurrent = mProvince.getCurrentItem();
		mCurrentProviceName = array1[pCurrent];
		String[] cities = mCitisDatasMap1.get(mCurrentProviceName);
		if (cities == null) {
			cities = new String[] { "" };
		}
		Log.i("777771111111", "" + mCurrentProviceName);
		Log.i("77777", "" + Arrays.asList(cities));
		mCity.setViewAdapter(new ArrayWheelAdapter<String>(this, cities));
		mCity.setCurrentItem(0);
		updateAreas();
	}

4)  根據當前的市更新相應的區

private void updateAreas() {
		int pCurrent = mCity.getCurrentItem();
		mCurrentCityName = mCitisDatasMap1.get(mCurrentProviceName)[pCurrent];
		Log.i("5555555555", "--" + mCurrentCityName);
		Log.i("5555555555", "--" + mCitisDatasMap1.get(mCurrentProviceName)[pCurrent]);
		String[] areas = mAreaDatasMap1.get(mCurrentCityName);

		if (areas == null) {
			areas = new String[] { "" };
		}
		Log.i("6666666666", "" + Arrays.asList(areas));
		mArea.setViewAdapter(new ArrayWheelAdapter<String>(this, areas));
		mArea.setCurrentItem(0);
	} 

5)     聯動效果的實現代碼

@Override
	public void onChanged(WheelView wheel, int oldValue, int newValue) {
		if (wheel == mProvince) {
			Log.i("4444444444444444", "8888888888888");
			updateCities();
			if (mAreaDatasMap1 != null && mAreaDatasMap1.get(mCurrentCityName) != null) {
				mCurrentAreaName = mAreaDatasMap1.get(mCurrentCityName)[0];
			} else {
				mCurrentAreaName = "";
			}
		} else if (wheel == mCity) {
			updateAreas();
			// 地區
			if (mAreaDatasMap1 != null && mAreaDatasMap1.get(mCurrentCityName) != null) {
				mCurrentAreaName = mAreaDatasMap1.get(mCurrentCityName)[0];
			} else {
				mCurrentAreaName = "";
			}
		} else if (wheel == mArea) {
			mCurrentAreaName = mAreaDatasMap1.get(mCurrentCityName)[newValue];
			if (mAreaDatasMap1 != null && mAreaDatasMap1.get(mCurrentCityName) != null) {
				mCurrentAreaName = mAreaDatasMap1.get(mCurrentCityName)[newValue];
			} else {
				mCurrentAreaName = "";
			}
		}
	}

6)     動態更新省市區的代碼


private void changeSheng(String sheng) {
		Log.i("sheng", sheng);
		for (int i = 0; i < array1.length; i++) {
			if (array1[i].equals(sheng)) {
				mProvince.setCurrentItem(i);
				Log.i("sheng", array1[i]);
			}
		}

	}

	private void changeShi(String shi) {
		Log.i("shi", shi);
		int pCurrent = mProvince.getCurrentItem();
		mCurrentProviceName = array1[pCurrent];
		String[] cities = mCitisDatasMap1.get(mCurrentProviceName);
		if (cities == null) {
			cities = new String[] { "" };
		}
		for (int i = 0; i < cities.length; i++) {
			if (cities[i].equals(shi)) {
				mCity.setCurrentItem(i);
				Log.i("shi1111111", cities[i]);
			}
		}

	}

	private void changeQu(String qu) {
		Log.i("qu", qu);
		int pCurrent = mCity.getCurrentItem();
		mCurrentCityName = mCitisDatasMap1.get(mCurrentProviceName)[pCurrent];
		String[] areas = mAreaDatasMap1.get(mCurrentCityName);

		if (areas == null) {
			areas = new String[] { "" };
		}
		for (int i = 0; i < areas.length; i++) {
			if (areas[i].equals(qu)) {
				mArea.setCurrentItem(i);
				Log.i("qu111111", areas[i]);
			}
		}
	}

6.      如需修改代碼只需要改動以下內容

1)     根據json數據的不同自行解析自己的json數據就行,相信大家對於解析json很擅長。

2)     亂碼的問題:用editplus重新編碼json文件,然後將代碼中解碼也改成utf-8在試一下。

代碼下載地址
點擊打開鏈接



發佈了21 篇原創文章 · 獲贊 26 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章