Android全國省市縣逐級選擇

全國省市縣選擇在app中是十分常見的,個人信息資料填寫需要,電商填寫收貨地址需要弧轧,按地區(qū)分類填寫地址需要礁遣。有的是用wheelview滾輪實現(xiàn)斑芜,這里我是用的popupwindow實現(xiàn)。

github代碼直通車

先上效果圖:


giphy.gif

全國省市縣數(shù)據(jù)文件

json數(shù)據(jù)展示

1.從資源文件中讀取完整json字符串祟霍,用openRawResource()方法打開raw文件夾下的文件杏头。

    private String getAddress() {
        StringBuilder sb = new StringBuilder();
        try {
            InputStream inputStream = context.getResources().openRawResource(R.raw.area);
            byte[] buffer = new byte[1024];
            while (inputStream.read(buffer) != -1) {
                sb.append(new String(buffer, "UTF-8"));
            }
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }

2.分別解析出所有省市縣集合

    /**
     * 解析出所有省市縣
     */
    private void parseArray() {
        try {
            JSONObject object = new JSONObject(getAddress());
            JSONArray provinceArray = object.getJSONArray("province");
            JSONArray cityArray = object.getJSONArray("city");
            JSONArray countyArray = object.getJSONArray("district");
            provinceDatas = JSON.parseArray(provinceArray.toString(), ProvinceEntity.class);
            cityDatas = JSON.parseArray(cityArray.toString(), CityEntity.class);
            countyDatas = JSON.parseArray(countyArray.toString(), CountyEntity.class);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

3.逐步解析省市縣:所有的省市縣對象都有名稱text和標(biāo)記id。id由6個數(shù)字組成沸呐,前2位是省份標(biāo)識醇王,中間2位是市標(biāo)識,后面2位是縣標(biāo)識垂谢。先選擇省厦画,用id截取前2位數(shù)字,遍歷所有市前2位相等則找到對應(yīng)市滥朱。選擇市根暑,用id截取前2位數(shù)字,遍歷所有縣的id前2位徙邻,相等的則為下屬所有縣排嫌。

實體類:

public class ProvinceEntity {
    private String text;
    private String id;
    //sett get
}

public class CityEntity {
    private String text;
    private String id;
    //get  set
}

public class CountyEntity {
    private String text;
    private String id;
    private String zipcode;
    //get  set
}

關(guān)鍵代碼:

/**
     * 選擇省
     */
    private void selectProvince() {

        recyclerView = (RecyclerView) view.findViewById(R.id.rv_popup_address);
        recyclerView.setLayoutManager(new LinearLayoutManager(context));

        parseArray();
        CommonAdapter commonAdapter = new CommonAdapter<ProvinceEntity>(context,R.layout.item_address_textview,provinceDatas) {
            @Override
            protected void convert(ViewHolder holder, ProvinceEntity provinceEntity, int position) {
                holder.setText(R.id.tv_popup_place,provinceEntity.getText());
            }
        };
        recyclerView.setAdapter(commonAdapter);
        commonAdapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
                saveProvinceCode = provinceDatas.get(position).getId();
                saveProvinceName = provinceDatas.get(position).getText();
                provinceChargeCode = saveProvinceCode.substring(0, 2);
                String cityCode;
                for (int i = 0; i < cityDatas.size(); i++) {
                    cityCode = cityDatas.get(i).getId();
                    if (provinceChargeCode.equals(cityCode.substring(0, 2))) {
                        currentCitiesDatas.add(cityDatas.get(i));
                    }
                }
                selectCites();
            }

            @Override
            public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
                return false;
            }
        });

        view.findViewById(R.id.tv_popup_cancel).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
                view.clearAnimation();
            }
        });
    }

    /**
     * 根據(jù)當(dāng)前省選擇市
     */
    private void selectCites(){
        CommonAdapter adapter = new CommonAdapter<CityEntity>(context,R.layout.item_address_textview,currentCitiesDatas) {
            @Override
            protected void convert(ViewHolder holder, CityEntity cityEntity, int position) {
                holder.setText(R.id.tv_popup_place,cityEntity.getText());
            }
        };
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
                saveCityCode = currentCitiesDatas.get(position).getId();
                saveCityName = currentCitiesDatas.get(position).getText();
                citiesChargeCode = saveCityCode.substring(2, 4);
                String countyCode;
                for (int i = 0; i < countyDatas.size(); i++) {
                    countyCode = countyDatas.get(i).getId();
                    if (countyCode.substring(0, 2).equals(provinceChargeCode) && countyCode.substring(2,4).equals(citiesChargeCode)) {
                        currentCountiesDatas.add(countyDatas.get(i));
                    }
                }
                selectCounties();
            }

            @Override
            public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
                return false;
            }
        });
    }

    /**
     * 根據(jù)當(dāng)前市選擇縣
     */
    private void selectCounties(){
        CommonAdapter adapter = new CommonAdapter<CountyEntity>(context,R.layout.item_address_textview,currentCountiesDatas) {
            @Override
            protected void convert(ViewHolder holder, CountyEntity countyEntity, int position) {
                holder.setText(R.id.tv_popup_place,countyEntity.getText());
            }
        };
        recyclerView.setAdapter(adapter);
        adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
                saveCountyCode = currentCountiesDatas.get(position).getId();
                saveCountyName = currentCountiesDatas.get(position).getText();
                saveZipCode = currentCountiesDatas.get(position).getZipcode();
                dismiss();
                view.clearAnimation();

                if(callBack != null){
                    callBack.callBack(saveProvinceName + ";" + saveCityName + ";" + saveCountyName);
                }
            }

            @Override
            public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
                return false;
            }
        });

    }

4.Popupwindow使用方法:rootview為頁面根布局

        AddressPopupWindow addressPopupWindow = new AddressPopupWindow(this);
        addressPopupWindow.showAtLocation(rootView, Gravity.BOTTOM, 0, 0);

完整代碼請看github上demo。后續(xù)會出全球國家選擇器缰犁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淳地,一起剝皮案震驚了整個濱河市怖糊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颇象,老刑警劉巖伍伤,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異遣钳,居然都是意外死亡扰魂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門蕴茴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劝评,“玉大人,你說我怎么就攤上這事倦淀〗螅” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵撞叽,是天一觀的道長姻成。 經(jīng)常有香客問我,道長愿棋,這世上最難降的妖魔是什么佣渴? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮初斑,結(jié)果婚禮上辛润,老公的妹妹穿的比我還像新娘。我一直安慰自己见秤,他們只是感情好砂竖,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鹃答,像睡著了一般乎澄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上测摔,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天置济,我揣著相機與錄音,去河邊找鬼锋八。 笑死浙于,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挟纱。 我是一名探鬼主播羞酗,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼紊服!你這毒婦竟也來了檀轨?” 一聲冷哼從身側(cè)響起胸竞,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎参萄,沒想到半個月后卫枝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡讹挎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年剃盾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淤袜。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衰伯,靈堂內(nèi)的尸體忽然破棺而出铡羡,到底是詐尸還是另有隱情,我是刑警寧澤意鲸,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布烦周,位于F島的核電站,受9級特大地震影響怎顾,放射性物質(zhì)發(fā)生泄漏读慎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一槐雾、第九天 我趴在偏房一處隱蔽的房頂上張望夭委。 院中可真熱鬧,春花似錦募强、人聲如沸株灸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽慌烧。三九已至,卻和暖如春鸠儿,著一層夾襖步出監(jiān)牢的瞬間屹蚊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工进每, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汹粤,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓田晚,卻偏偏與公主長得像玄括,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肉瓦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容