這篇文章主要介紹了Android如何實現(xiàn)尚型省市區(qū)三級聯(lián)動選擇效果,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
專注于為中小企業(yè)提供網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)永嘉免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
Android省市區(qū)選擇三級聯(lián)動效果,一個不大不小的功能,就算你做過,但是沒有相關(guān)的代碼直接寫,也要花掉你至少半天時間。
先上效果圖
一、準(zhǔ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>() { @Override public void subscribe(ObservableEmitter
> emitter) throws Exception { List
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 >() { }.getType()); } catch (Exception e) { e.printStackTrace(); } finally { emitter.onNext(provinces); } } }).subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer
>() { @Override public void accept(List
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(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); // 獲取當(dāng)前省份對應(yīng)的城市l(wèi)ist cityList.clear(); List 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 (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 (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) { } });
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Android如何實現(xiàn)尚型省市區(qū)三級聯(lián)動選擇效果”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!