1. 程式人生 > >使用pickerview實現(省市區)地址選擇器的三級聯動

使用pickerview實現(省市區)地址選擇器的三級聯動

此三級聯動的實現基於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();
}

完成。