一步搞定三级地址联动选择器

  有时在完成安卓项目的时候,会遇到地址相关的选择例如电商平台的收货地址选择,例如问卷调查的居住地址填写等等。有时会有后台的接口可以直接调用,但有时后台是没有封装接口的,这个时候就需要前端自己完成这个步骤了。虽然可以通过自己搜寻数据源再加上spinner等等的方法慢慢实现,但这种方法总会有着这样那样的问题,例如数据源不准确找不到相应地区,构建过程麻烦费时等等。在github上偶尔找到了一个集成了这个功能的库,使用它可以轻松地实现三级地址联动的选择。这里只讲解仿ios的地址选择器样式的实现,其他样式实现可以在作者的github项目中查看

github地址:这里

示例

初始工作

  首先就是要导入库,我们只需要在gradle中引用即可。

  1. 在 Project 的 build.gradle 中增加 jitpack 的 maven 地址

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    
  2. 在 app 的 build.gradle 中增加我们开源库的引用

        dependencies {
                implementation 'com.github.crazyandcoder:citypicker:6.0.2'
        }
    
  3. androidx项目可能无法使用2.中的方法导入库,我们需要改为:

    dependencies {
            implementation 'liji.library.dev:citypickerview:5.2.2' 
    }
    

Java代码实现

  • 第一步因为三级地址中的地址数据过多,所以在使用之前需要对控件进行初始化。只需要在界面常见完成后调用init方法即可。例如:

    public class AddNewAddressActivity extends Activity {
    
        //申明对象
        CityPickerView mPicker=new CityPickerView();
    
        @Override
        public void onCreate() {
            super.onCreate();
            
            //预先加载仿iOS滚轮实现的全部数据
            mPicker.init(this);
        }
    }
    
  • 第二步建立地址选择器builder并配置相关属性。示例代码如下:

    CityConfig cityConfig = new CityConfig.Builder()
                    .title("选择城市")//标题
                    .titleTextSize(18)//标题文字大小
                    .titleTextColor("#585858")//标题文字颜  色
                    .titleBackgroundColor("#E9E9E9")//标题栏背景色
                    .confirTextColor("#585858")//确认按钮文字颜色
                    .confirmText("ok")//确认按钮文字
                    .confirmTextSize(16)//确认按钮文字大小
                    .cancelTextColor("#585858")//取消按钮文字颜色
                    .cancelText("cancel")//取消按钮文字
                    .cancelTextSize(16)//取消按钮文字大小
                    .setCityWheelType(CityConfig.WheelType.PRO_CITY_DIS)//显示类,只显示省份一级,显示省市两级还是显示省市区三级
                    .showBackground(true)//是否显示半透明背景
                    .visibleItemsCount(7)//显示item的数量
                    .province("浙江省")//默认显示的省份
                    .city("杭州市")//默认显示省份下面的城市
                    .district("滨江区")//默认显示省市下面的区县数据
                    .provinceCyclic(true)//省份滚轮是否可以循环滚动
                    .cityCyclic(true)//城市滚轮是否可以循环滚动
                    .districtCyclic(true)//区县滚轮是否循环滚动
                    .setCustomItemLayout(R.layout.item_city)//自定义item的布局
                    .setCustomItemTextViewId(R.id.item_city_name_tv)//自定义item布局里面的textViewid
                    .drawShadows(false)//滚轮不显示模糊效果
                    .setLineColor("#03a9f4")//中间横线的颜色
                    .setLineHeigh(5)//中间横线的高度
                    .setShowGAT(true)//是否显示港澳台数据,默认不显示
                    .build();
    
    //设置自定义的属性配置
    CityPickerView.getInstance().setConfig(cityConfig);
    
  • 第三步重写监听器方法。重写用户点击选择地址后的监听器实现其他功能的连接,示例代码如下:

    //监听选择点击事件及返回结果
    mPicker.setOnCityItemClickListener(new OnCityItemClickListener() {
                @Override
                public void onSelected(ProvinceBean province, CityBean city, DistrictBean district) {
                     
                    //省份province               
                    //城市city
                    //地区district 
                }
                
                @Override
                public void onCancel() {
                    ToastUtils.showLongToast(this, "已取消");
                }
            });
    
  • 第四步在合适的地方调用选择器显示函数,例如监听点击按钮后等等,具体代码:

        //显示
            mPicker.showCityPicker( );
    

杂谈

  关于开头那个Androidx项目的问题卡了我很久的时间,真的没有搞懂为啥Androidx项目不能使用,直到翻了github中的issue作者里面有提及暂时不支持Androidx项目。接着我翻别的博客时到了第二种引用库的方式,点开github地址发现也是这个项目(晕了)


初めて会ったの日から 僕の心の全てを奪った