安卓基礎--三分鐘實現省市縣三級聯動
阿新 • • 發佈:2019-01-05
還記得之前課本上講的牛頓的那句名言吧?“如果我看得更遠一點的話,是因為我站在巨人的肩膀上。”所以說如果有巨人的肩膀還是要粘一下光的,哈哈。所以推薦一個非常好用的實現三級聯動的庫,有了這個,就可以三分鐘整合時間選擇器,省市縣選擇器。
專案地址:https://github.com/Bigkoo/Android-PickerView,專案介紹寫的非常詳細。
1.新增依賴: compile ‘com.contrarywind:Android-PickerView:3.2.6’
2.資料模型:一個json檔案放在assets目錄下
3.程式碼實現。
在這裡我要實現的是省市的選擇器。
首先因為省市縣的資料太多,而且基本上不會改變,每次都從網路上拉去取的話要慢很多,而且也加重了伺服器的壓力,所以建議存在本地。建議把這個json檔案放在assets資料夾下:檔案內容如下,(切記檔案字尾是.json) ,當然也可以用資料庫儲存。
然後我們就要開啟子執行緒來獲取資料了
Thread thread = new Thread(new Runnable() { @Override public void run() { // 寫子執行緒中的操作,解析省市區資料 initJsonData(); } }); thread.start(); private void initJsonData() { /** * 注意:assets 目錄下的Json檔案僅供參考,實際使用可自行替換檔案 * 關鍵邏輯在於迴圈體 * * */ String jsonData = new GetJsonDataUtil().getJson(this, "province.json");//獲取assets目錄下的json檔案資料 ArrayList<JsonBean> jsonBean = parseJsonData(jsonData);//用Gson 轉成實體 /** * 新增省份資料 * * 注意:如果是新增的JavaBean實體,則實體類需要實現 IPickerViewData 介面, * PickerView會通過getPickerViewText方法獲取字串顯示出來。 */ options1Items = jsonBean; for (int i = 0; i < jsonBean.size(); i++) {//遍歷省份 ArrayList<String> CityList = new ArrayList<>();//該省的城市列表(第二級) ArrayList<ArrayList<String>> Province_AreaList = new ArrayList<>();//該省的所有地區列表(第三極) for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍歷該省份的所有城市 String CityName = jsonBean.get(i).getCityList().get(c).getName(); CityList.add(CityName);//新增城市 ArrayList<String> City_AreaList = new ArrayList<>();//該城市的所有地區列表 //如果無地區資料,建議新增空字串,防止資料為null 導致三個選項長度不匹配造成崩潰 if (jsonBean.get(i).getCityList().get(c).getArea() == null || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) { City_AreaList.add(""); } else { for (int d = 0; d < jsonBean.get(i).getCityList().get(c).getArea().size(); d++) {//該城市對應地區所有資料 String AreaName = jsonBean.get(i).getCityList().get(c).getArea().get(d); City_AreaList.add(AreaName);//新增該城市所有地區資料 } } Province_AreaList.add(City_AreaList);//新增該省所有地區資料 } /** * 新增城市資料 */ options2Items.add(CityList); /** * 新增地區資料 */ options3Items.add(Province_AreaList); } } private ArrayList<JsonBean> parseJsonData(String result) { ArrayList<JsonBean> detail = new ArrayList<>(); try { JSONArray data = new JSONArray(result); Gson gson = new Gson(); for (int i = 0; i < data.length(); i++) { JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class); detail.add(entity); } } catch (Exception e) { e.printStackTrace(); mHandler.sendEmptyMessage(MSG_LOAD_FAILED); } return detail; } //省市縣彈框 private void ShowPickerView() { OptionsPickerView pvOptions = new OptionsPickerView.Builder(this, new OptionsPickerView.OnOptionsSelectListener() { @Override public void onOptionsSelect(int options1, int options2, int options3, View v) { //返回的分別是三個級別的選中位置 String tx = options1Items.get(options1).getPickerViewText() + options2Items.get(options1).get(options2); tvBankProvince.setText(tx+""); } }) .setTitleText("城市選擇") .setDividerColor(mContext.getResources().getColor(R.color.bg_blue)) .setTextColorCenter(mContext.getResources().getColor(R.color.bg_blue)) //設定選中項文字顏色 .setContentTextSize(20) .build(); //pvOptions.setPicker(options1Items);//一級選擇器 pvOptions.setPicker(options1Items, options2Items);//二級選擇器 //pvOptions.setPicker(options1Items, options2Items,options3Items);//三級選擇器 pvOptions.show(); }