国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

最好用的Android省市區(qū)三級聯(lián)動選擇效果

2019-12-12 01:11:12
字體:
供稿:網(wǎng)友

Android省市區(qū)選擇三級聯(lián)動效果,一個不大不小的功能,就算你做過,但是沒有相關(guān)的代碼直接寫,也要花掉你至少半天時間。

下面我寫出我的實現(xiàn)過程(思路絕對清晰)。

先上效果圖


一、準備數(shù)據(jù)

我是用的本地的json數(shù)據(jù)(走網(wǎng)絡(luò)的話太慢,每次都要請求),放在asserts中。格式如下:

[{  "name": "河北省",  "city": [   {   "name": "石家莊市",   "area": [    "長安區(qū)",    "橋東區(qū)",    "橋西區(qū)",    "新華區(qū)",    "郊 區(qū)",    "井陘礦區(qū)",    "井陘縣",    "正定縣",    "欒城縣",    "行唐縣",    "靈壽縣",    "高邑縣",    "深澤縣",    "贊皇縣",    "無極縣",    "平山縣",    "元氏縣",    "趙 縣",    "辛集市",    "藁",    "晉州市",    "新樂市",    "鹿泉市"   ]   },......] 

二、解析數(shù)據(jù)

首先根據(jù)json生成Province對象

然后通過getAssets().open("citylist.json");獲取文件輸入流,接著轉(zhuǎn)成字節(jié),最終獲取字符串。

然后用Gson解析字符串得到Province的List對象。由于讀文件是IO操作,這里我用了RxJava,代碼如下:

/**   * 從assert文件夾中獲取json數(shù)據(jù)   */  private void initJsonData() {    Observable.create(new ObservableOnSubscribe<List<Province>>() {    @Override    public void subscribe(ObservableEmitter<List<Province>> emitter) throws Exception {     List<Province> provinces = new ArrayList<>();     try {      StringBuffer sb = new StringBuffer();      InputStream is = getAssets().open("citylist.json");//打開json數(shù)據(jù)      byte[] by = new byte[is.available()];//轉(zhuǎn)字節(jié)      int len = -1;      while ((len = is.read(by)) != -1) {       sb.append(new String(by, 0, len, "utf8"));//根據(jù)字節(jié)長度設(shè)置編碼      }      is.close();// 關(guān)閉流      // 通過Gson將字符串轉(zhuǎn)成對象list      Gson gson = new Gson();      provinces = gson.fromJson(sb.toString(), new TypeToken<List<Province>>() {      }.getType());     } catch (Exception e) {      e.printStackTrace();     } finally {      emitter.onNext(provinces);     }    }   }).subscribeOn(Schedulers.io())     .observeOn(AndroidSchedulers.mainThread())     .subscribe(new Consumer<List<Province>>() {      @Override      public void accept(List<Province> provinces) throws Exception {       if (provinces != null && provinces.size() > 0) {        RegionSelectActivity.this.provinces = provinces;        // 顯示數(shù)據(jù)        showData();       }      }     });  }

三、顯示數(shù)據(jù)

RxJava異步讀取數(shù)據(jù)后就可以顯示了,這里用了三個Spinner來分別顯示省,市,區(qū)數(shù)據(jù)。

顯示的思路大家都清楚,這里不再贅述,代碼如下

/**   * 展示數(shù)據(jù)   */  private void showData() {   for (Province province : provinces) {    provinceList.add(province.getName());   }   // 顯示省份數(shù)據(jù)   spProvince.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, provinceList));   spProvince.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {     provincePosition = position;     provinceName = provinceList.get(position);     // 獲取當前省份對應的城市l(wèi)ist     cityList.clear();     List<Province.CityBean> cityBeans = provinces.get(position).getCity();     for (Province.CityBean city : cityBeans) {      cityList.add(city.getName());     }     // 刷新城市列表     spCity.setSelection(0);     cityName = cityList.get(0);     cityAdapter.notifyDataSetChanged();      // 刷新城區(qū)列表     updateArea(0);    }     @Override    public void onNothingSelected(AdapterView<?> parent) {     }   });    // 顯示城市數(shù)據(jù)   spCity.setAdapter(cityAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, cityList));   spCity.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {     cityPosition = position;     cityName = cityList.get(position);     // 刷新城區(qū)列表     updateArea(position);    }     @Override    public void onNothingSelected(AdapterView<?> parent) {     }   });    // 顯示城區(qū)數(shù)據(jù)   spArea.setAdapter(areaAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, areaList));   spArea.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {    @Override    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {     areaName = areaList.get(position);    }     @Override    public void onNothingSelected(AdapterView<?> parent) {     }   }); 

四、高德地圖獲取當前城市

調(diào)用了高德地圖,抽象成了BaseLocationActivity,用的時候只需要繼承自它,然后實現(xiàn)抽象方法LocationResult,即可拿到結(jié)果。

模擬器上獲取不到數(shù)據(jù),所以沒有顯示,在真機上是可以正常獲取數(shù)據(jù)的

代碼地址:下載地址

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 子洲县| 香格里拉县| 固阳县| 襄樊市| 江阴市| 上杭县| 县级市| 西林县| 西丰县| 且末县| 宜君县| 宝山区| 长宁区| 大英县| 梁河县| 牙克石市| 沂水县| 永泰县| 江山市| 龙岩市| 永靖县| 丹棱县| 沾化县| 延寿县| 新巴尔虎左旗| 崇信县| 宜城市| 大埔区| 内乡县| 普安县| 中超| 丹东市| 车致| 青铜峡市| 杭锦后旗| 台南市| 平武县| 虹口区| 苍山县| 巫山县| 台南县|