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

初始工作
首先就是要导入库,我们只需要在gradle中引用即可。
在 Project 的 build.gradle 中增加 jitpack 的 maven 地址
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }在 app 的 build.gradle 中增加我们开源库的引用
dependencies { implementation 'com.github.crazyandcoder:citypicker:6.0.2' }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地址发现也是这个项目(晕了)

