使用pickerview實現(省市區)地址選擇器的三級聯動
阿新 • • 發佈:2019-01-24
此三級聯動的實現基於pickerview,附上github地址:Android-PickerView
這是一款仿iOS的PickerView控制元件,有時間選擇和選項選擇,並支援一二三級聯動,支援自定義樣式。
首先下載pickerview,將其作為Module新增進你的專案
我使用的as,xutils框架,因為我的資料內容跟原作者的不一樣,所以獲取的方法不一樣。
我的一組資料如下,省市區檔案以txt文字的方式放在assets目錄下
建立一個表存取省市區資料
Region.class
import org.xutils.db.annotation.Column; import org.xutils.db.annotation.Table; @Table(name = "region") public class Region {@Column(name = "id", isId = true) private int id; @Column(name = "pid") private int pid; @Column(name = "name") private String name; @Column(name = "type") private int type; public Region(int _id, int _pid, String _name, int _type) { this.id = _id; this.name = _name; this.type = _type; this.pid = _pid; } public Region() { this.id = 0; this.pid = 0; this.name = ""; this.type = 0; } @Override public String toString() { return "Region{" + "id=" + id+ ", pid=" + pid + ", name='" + name + '\'' + ", type=" + type + '}'; } public int getId() { return id; } public int getPid() { return pid; } public String getName() { if (name == null) { name = ""; } return name; } public int getType() { return type; } public void setId(int id) { this.id = id; } public void setPid(int pid) { this.pid = pid; } public void setName(String name) { this.name = name; } public void setType(int type) { this.type = type; } }
在app啟動的時候,將資料插入表內
try { JSONObject jsonObject = new JSONObject(getFromAssets("addr.txt")); JSONArray jsonArray = jsonObject.getJSONArray("data"); SystemConfig sysConfig = db.selector(SystemConfig.class).where("_key", "=", "region").findFirst();// 查詢資料庫內是否存在表region if (sysConfig == null) {// 不存在則建立for (int i = 0; i < jsonArray.length(); i++) {// jsonArray.length()==3409 JSONArray array = jsonArray.getJSONArray(i); Region region = new Region(array.getInt(0), array.getInt(1), array.getString(2), array.getInt(3)); db.save(region); } db.save(new SystemConfig("region", jsonArray.length() + "")); } } catch (JSONException e) { e.printStackTrace(); } catch (DbException e) { e.printStackTrace(); }
//從assets 資料夾中獲取檔案並讀取資料 public String getFromAssets(String fileName) { String result = ""; try { InputStream in = getResources().getAssets().open(fileName); //獲取檔案的位元組數 int lenght = in.available(); //建立byte陣列 byte[] buffer = new byte[lenght]; //將檔案中的資料讀到byte陣列中 in.read(buffer); result = new String(buffer, "GBK"); } catch (Exception e) { e.printStackTrace(); } return result; }
資料已經準備好了,接下來在需要彈出選擇器的頁面進行操作
private String idProvince;// 省id private String idCity;// 市id private String idArea;// 區id private ArrayList<String> options1Items = new ArrayList<>();// 省集合 private ArrayList<ArrayList<String>> options2Items = new ArrayList<>();// 市集合 private ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>();// 區集合activity建立的時候對集合賦值
private void initData() { try { List<Region> province = db.selector(Region.class).where("type", "=", 1).findAll(); for (int i = 0; i < province.size(); i++) {//遍歷省份 options1Items.add(province.get(i).getName()); idProvince = province.get(i).getId() + ""; ArrayList<String> CityList = new ArrayList<>();//該省的城市列表(第二級) ArrayList<ArrayList<String>> Province_AreaList = new ArrayList<>();//該省的所有地區列表(第三極) List<Region> city = db.selector(Region.class).where("pid", "=", idProvince).and("type", "=", 2).findAll(); for (int c = 0; c < city.size(); c++) {//遍歷該省份的所有城市 CityList.add(city.get(c).getName());//新增城市 idCity = city.get(c).getId() + ""; ArrayList<String> City_AreaList = new ArrayList<>();//該城市的所有地區列表 List<Region> area = db.selector(Region.class).where("pid", "=", idCity).and("type", "=", 3).findAll(); //如果無地區資料,建議新增空字串,防止資料為null 導致三個選項長度不匹配造成崩潰 if (area.size() == 0) { City_AreaList.add(""); } else { for (int d = 0; d < area.size(); d++) {//該城市對應地區所有資料 City_AreaList.add(area.get(d).getName());//新增該城市所有地區資料 } } Province_AreaList.add(City_AreaList);//新增該省所有地區資料 } /** * 新增城市資料 */ options2Items.add(CityList); /** * 新增地區資料 */ options3Items.add(Province_AreaList); } } catch (DbException e) { e.printStackTrace(); } }
點選事件
case R.id.ll_home:// 居住地選擇 ShowPickerView(); break;
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) + options2Items.get(options1).get(options2) + options3Items.get(options1).get(options2).get(options3); } }) .setTitleText("城市選擇") .setDividerColor(Color.BLACK) .setTextColorCenter(Color.BLACK) //設定選中項文字顏色 .setContentTextSize(20) .setOutSideCancelable(false)// default is true .build(); pvOptions.setPicker(options1Items, options2Items, options3Items);//三級選擇器 pvOptions.show(); }
完成。