1. 程式人生 > >安卓基礎--三分鐘實現省市縣三級聯動

安卓基礎--三分鐘實現省市縣三級聯動

還記得之前課本上講的牛頓的那句名言吧?“如果我看得更遠一點的話,是因為我站在巨人的肩膀上。”所以說如果有巨人的肩膀還是要粘一下光的,哈哈。所以推薦一個非常好用的實現三級聯動的庫,有了這個,就可以三分鐘整合時間選擇器,省市縣選擇器。
專案地址: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();
}