溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android如何實現尚型省市區(qū)三級聯動選擇效果

發(fā)布時間:2021-06-26 11:26:35 來源:億速云 閱讀:609 作者:小新 欄目:移動開發(fā)

這篇文章主要介紹了Android如何實現尚型省市區(qū)三級聯動選擇效果,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

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

先上效果圖

Android如何實現尚型省市區(qū)三級聯動選擇效果

一、準備數據

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

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

二、解析數據

首先根據json生成Province對象

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

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

/** 
  * 從assert文件夾中獲取json數據 
  */ 
 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數據 
     byte[] by = new byte[is.available()];//轉字節(jié) 
     int len = -1; 
     while ((len = is.read(by)) != -1) { 
      sb.append(new String(by, 0, len, "utf8"));//根據字節(jié)長度設置編碼 
     } 
     is.close();// 關閉流 
     // 通過Gson將字符串轉成對象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; 
       // 顯示數據 
       showData(); 
      } 
     } 
    }); 
 }

三、顯示數據

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

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

/** 
  * 展示數據 
  */ 
 private void showData() { 
  for (Province province : provinces) { 
   provinceList.add(province.getName()); 
  } 
  // 顯示省份數據 
  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) { 
 
   } 
  }); 
 
  // 顯示城市數據 
  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ū)數據 
  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) { 
 
   } 
  });

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Android如何實現尚型省市區(qū)三級聯動選擇效果”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業(yè)資訊頻道,更多相關知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI