安卓基础--三分钟实现省市县三级联动

还记得之前课本上讲的牛顿的那句名言吧?“如果我看得更远一点的话,是因为我站在巨人的肩膀上。”所以说如果有巨人的肩膀还是要粘一下光的,哈哈。所以推荐一个非常好用的实现三级联动的库,有了这个,就可以三分钟集成时间选择器,省市县选择器。
项目地址:https://github.com/Bigkoo/Android-PickerView,项目介绍写的非常详细。
1.添加依赖: compile ‘com.contrarywind:Android-PickerView:3.2.6’
2.数据模型:一个json文件放在assets目录下
3.代码实现。
在这里我要实现的是省市的选择器。
首先因为省市县的数据太多,而且基本上不会改变,每次都从网络上拉去取的话要慢很多,而且也加重了服务器的压力,所以建议存在本地。建议把这个json文件放在assets文件夹下:文件内容如下,(切记文件后缀是.json) ,当然也可以用数据库存储。
然后我们就要开启子线程来获取数据了

 Thread thread = new Thread(new Runnable() {
                        @Override
                        public void run() {
                            // 写子线程中的操作,解析省市区数据
                            initJsonData();
                        }
                    });
                    thread.start();
     private void initJsonData() {
        /**
         * 注意:assets 目录下的Json文件仅供参考,实际使用可自行替换文件
         * 关键逻辑在于循环体
         *
         * */
    String jsonData = new GetJsonDataUtil().getJson(this, "province.json");//获取assets目录下的json文件数据

    ArrayList<JsonBean> jsonBean = parseJsonData(jsonData);//用Gson 转成实体

    /**
     * 添加省份数据
     *
     * 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口,
     * PickerView会通过getPickerViewText方法获取字符串显示出来。
     */
    options1Items = jsonBean;

    for (int i = 0; i < jsonBean.size(); i++) {//遍历省份
        ArrayList<String> CityList = new ArrayList<>();//该省的城市列表(第二级)
        ArrayList<ArrayList<String>> Province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极)

        for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市
            String CityName = jsonBean.get(i).getCityList().get(c).getName();
            CityList.add(CityName);//添加城市

            ArrayList<String> City_AreaList = new ArrayList<>();//该城市的所有地区列表

            //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃
            if (jsonBean.get(i).getCityList().get(c).getArea() == null
                    || jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {
                City_AreaList.add("");
            } else {

                for (int d = 0; d < jsonBean.get(i).getCityList().get(c).getArea().size(); d++) {//该城市对应地区所有数据
                    String AreaName = jsonBean.get(i).getCityList().get(c).getArea().get(d);

                    City_AreaList.add(AreaName);//添加该城市所有地区数据
                }
            }
            Province_AreaList.add(City_AreaList);//添加该省所有地区数据
        }

        /**
         * 添加城市数据
         */
        options2Items.add(CityList);

        /**
         * 添加地区数据
         */
        options3Items.add(Province_AreaList);
    }
}

private ArrayList<JsonBean> parseJsonData(String result) {
    ArrayList<JsonBean> detail = new ArrayList<>();
    try {
        JSONArray data = new JSONArray(result);
        Gson gson = new Gson();
        for (int i = 0; i < data.length(); i++) {
            JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);
            detail.add(entity);
        }
    } catch (Exception e) {
        e.printStackTrace();
        mHandler.sendEmptyMessage(MSG_LOAD_FAILED);
    }
    return detail;
}

//省市县弹框
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).getPickerViewText() +
                    options2Items.get(options1).get(options2);
            tvBankProvince.setText(tx+"");
        }
    })
            .setTitleText("城市选择")
            .setDividerColor(mContext.getResources().getColor(R.color.bg_blue))
            .setTextColorCenter(mContext.getResources().getColor(R.color.bg_blue)) //设置选中项文字颜色
            .setContentTextSize(20)
            .build();

    //pvOptions.setPicker(options1Items);//一级选择器
    pvOptions.setPicker(options1Items, options2Items);//二级选择器
//pvOptions.setPicker(options1Items, options2Items,options3Items);//三级选择器
    pvOptions.show();
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值