CityPicker 城市选择器 教程
CityPicker 城市选择器
详细的省市区地址信息,支持仿iOS滚轮实现,仿京东样式,一级或者三级列表展示方式。
CityPicker使用方法
样式——仿iOS滚轮实现及使用方法
首先需要预加载数据,如我们在AddNewAddressActivity中使用到省市区选择器的话,那么我们需要提前解析本地数据,这样在弹出来的时候不会卡顿,因为本地城市数据很多。
public class AddNewAddressActivity extends Activity {
//申明对象
CityPickerView mPicker=new CityPickerView();
@Override
public void onCreate() {
super.onCreate();
//预先加载仿iOS滚轮实现的全部数据
mPicker.init(this);
}
}
然后在需要弹出的地方如点击地区选择button时弹出它,
//添加默认的配置,不需要自己定义,当然也可以自定义相关熟悉,详细属性请看demo
CityConfig cityConfig = new CityConfig.Builder().build();
mPicker.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( );
详细属性
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);
以上若是使用了自定义的item布局的话,可以自定义item里面的背景、文字大小颜色等属性,下面是展示默认的布局。使用自定义的布局时需要注意的是,里面只能包含一个TextView控件,同时控件id需要跟上面设置的一致,否则不显示结果。 ,如果结果显示“hello”的话就说明,textviewId 跟上面设置的不一致。
//自定义的item_city.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/item_city_name_tv"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="hello"
android:textSize="18sp"
android:textStyle="bold"/>
</LinearLayout>
样式——(仿iOS滚轮实现)自定义数据源
1.增加自定义item样式属性
1.数据模型CustomCityData.java
public class CustomCityData {
private String id;
private String name;
private List<CustomCityData> list = new ArrayList<>();
}
2. 具体用法
2.1 设置数据源
/**
* 自定义数据源-省份数据
*/
private List<CustomCityData> mProvinceListData = new ArrayList<>();
CustomCityData jsPro = new CustomCityData("10000", "江苏省");
CustomCityData ycCity = new CustomCityData("11000", "盐城市");
List<CustomCityData> ycDistList = new ArrayList<>();
ycDistList.add(new CustomCityData("11100", "滨海县"));
ycDistList.add(new CustomCityData("11200", "阜宁县"));
ycDistList.add(new CustomCityData("11300", "大丰市"));
ycDistList.add(new CustomCityData("11400", "盐都区"));
ycCity.setList(ycDistList);
CustomCityData czCity = new CustomCityData("12000", "常州市");
List<CustomCityData> czDistList = new ArrayList<>();
czDistList.add(new CustomCityData("12100", "新北区"));
czDistList.add(new CustomCityData("12200", "天宁区"));
czDistList.add(new CustomCityData("12300", "钟楼区"));
czDistList.add(new CustomCityData("12400", "武进区"));
czCity.setList(czDistList);
List<CustomCityData> jsCityList = new ArrayList<>();
jsCityList.add(ycCity);
jsCityList.add(czCity);
jsPro.setList(jsCityList);
CustomCityData zjPro = new CustomCityData("20000", "浙江省");
CustomCityData nbCity = new CustomCityData("21000", "宁波市");
List<CustomCityData> nbDistList = new ArrayList<>();
nbDistList.add(new CustomCityData("21100", "海曙区"));
nbDistList.add(new CustomCityData("21200", "鄞州区"));
nbCity.setList(nbDistList);
CustomCityData hzCity = new CustomCityData("22000", "杭州市");
List<CustomCityData> hzDistList = new ArrayList<>();
hzDistList.add(new CustomCityData("22100", "上城区"));
hzDistList.add(new CustomCityData("22200", "西湖区"));
hzDistList.add(new CustomCityData("22300", "下沙区"));
hzCity.setList(hzDistList);
List<CustomCityData> zjCityList = new ArrayList<>();
zjCityList.add(hzCity);
zjCityList.add(nbCity);
zjPro.setList(zjCityList);
CustomCityData gdPro = new CustomCityData("30000", "广东省");
CustomCityData fjCity = new CustomCityData("21000", "潮州市");
List<CustomCityData> fjDistList = new ArrayList<>();
fjDistList.add(new CustomCityData("21100", "湘桥区"));
fjDistList.add(new CustomCityData("21200", "潮安区"));
fjCity.setList(fjDistList);
CustomCityData gzCity = new CustomCityData("22000", "广州市");
List<CustomCityData> szDistList = new ArrayList<>();
szDistList.add(new CustomCityData("22100", "荔湾区"));
szDistList.add(new CustomCityData("22200", "增城区"));
szDistList.add(new CustomCityData("22300", "从化区"));
szDistList.add(new CustomCityData("22400", "南沙区"));
szDistList.add(new CustomCityData("22500", "花都区"));
szDistList.add(new CustomCityData("22600", "番禺区"));
szDistList.add(new CustomCityData("22700", "黄埔区"));
szDistList.add(new CustomCityData("22800", "白云区"));
szDistList.add(new CustomCityData("22900", "天河区"));
szDistList.add(new CustomCityData("22110", "海珠区"));
szDistList.add(new CustomCityData("22120", "越秀区"));
gzCity.setList(szDistList);
List<CustomCityData> gdCityList = new ArrayList<>();
gdCityList.add(gzCity);
gdCityList.add(fjCity);
gdPro.setList(gdCityList);
mProvinceListData.add(jsPro);
mProvinceListData.add(zjPro);
mProvinceListData.add(gdPro);
2.2 设置config
CustomConfig cityConfig = new CustomConfig.Builder()
.title("选择城市")
.visibleItemsCount(5)
.setCityData(mProvinceListData)//设置数据源
.provinceCyclic(false)
.cityCyclic(false)
.districtCyclic(false)
.build();
2.3 CustomCityPicker使用
private CustomCityPicker customCityPicker = null;
customCityPicker = new CustomCityPicker(this);
customCityPicker.setCustomConfig(cityConfig);
customCityPicker.setOnCustomCityPickerItemClickListener(new OnCustomCityPickerItemClickListener() {
@Override
public void onSelected(CustomCityData province, CustomCityData city, CustomCityData district) {
if (province != null && city != null && district != null) {
resultTv.setText("province:" + province.getName() + " " + province.getId() + "\n" +
"city:" + city.getName() + " " + city.getId() + "\n" +
"area:" + district.getName() + " " + district.getId() + "\n");
}else{
resultTv.setText("结果出错!");
}
}
});
customCityPicker.showCityPicker();
3. 自定义属性
属性集合
.title("选择城市")//标题
.setCityData(List<CustomCityData> data)//自定义数据源
.titleTextSize(18)//标题文字大小
.titleTextColor("#585858")//标题文字颜 色
.titleBackgroundColor("#E9E9E9")//标题栏背景色
.confirTextColor("#585858")//确认按钮文字颜色
.confirmText("ok")//确认按钮文字
.confirmTextSize(16)//确认按钮文字大小
.cancelTextColor("#585858")//取消按钮文字颜色
.cancelText("cancel")//取消按钮文字
.cancelTextSize(16)//取消按钮文字大小
.showBackground(true)//是否显示半透明背景
.visibleItemsCount(7)//显示item的数量
.province("**")//设置默认省份
.city("**")//设置默认城市
.district("**")//设置默认地区
.provinceCyclic(true)//省份滚轮是否可以循环滚动
.cityCyclic(true)//城市滚轮是否可以循环滚动
.districtCyclic(true)//区县滚轮是否循环滚动
.setCustomItemLayout(R.layout.item_custome_city)//自定义item的布局
.setCustomItemTextViewId(R.id.item_custome_city_name_tv)
.drawShadows(false)//滚轮不显示模糊效果
.setLineColor("#03a9f4")//中间横线的颜色
.setLineHeigh(5)//中间横线的高度
.setCityWheelType(CustomConfig.WheelType.PRO_CITY_DIS)//设置显示省市区还是省市或者省级滚轮
样式——(仿京东样式)
仿京东样式代码用法
JDCityPicker cityPicker = new JDCityPicker();
JDCityConfig jdCityConfig = new JDCityConfig.Builder().build();
jdCityConfig.setShowType(JDCityConfig.ShowType.PRO_CITY_DIS);
cityPicker.init(this);
cityPicker.setConfig(jdCityConfig);
cityPicker.setOnCityItemClickListener(new OnCityItemClickListener() {
@Override
public void onSelected(ProvinceBean province, CityBean city, DistrictBean district) {
resultV.setText("城市选择结果:\n" + province.getName() + "(" + province.getId() + ")\n"
+ city.getName() + "(" + city.getId() + ")\n"
+ district.getName() + "(" + district.getId() + ")");
}
@Override
public void onCancel() {
}
});
cityPicker.showCityPicker();
样式——城市一级列表展示
该样式是列表展示所有的城市数据,大概有357个,每个城市数据包含的数据结构和其他样式返回的结果一致。使用方法如下:
预加载本地所有城市的数据
在自定义的Application中或者Activity中添加以下的代码,预先加载本地城市数据
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
/**
* 预先加载一级列表显示 全国所有城市市的数据
*/
CityListLoader.getInstance().loadCityData(this);
}
}
以上代码可以在使用地址选择器之前配置,可以在Application中或者在Activity的onCreate方法中加载使用。
跳转到列表
Intent intent = new Intent(CitypickerListActivity.this, CityListSelectActivity.class);
startActivityForResult(intent, CityListSelectActivity.CITY_SELECT_RESULT_FRAG);
获取选择结果
我们使用的是startActivityForResult方法,所以需要在activity中覆盖系统方法,然后获取选择的结果。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CityListSelectActivity.CITY_SELECT_RESULT_FRAG) {
if (resultCode == RESULT_OK) {
if (data == null) {
return;
}
Bundle bundle = data.getExtras();
CityInfoBean cityInfoBean = (CityInfoBean) bundle.getParcelable("cityinfo");
if (null == cityInfoBean) {
return;
}
mResultTv.setText("城市: " + cityInfoBean.toString());
}
}
}
数据结构如下
id //城市code
name //城市名称
pinYin //城市拼音
gisGcj02Lat //高德坐标系-纬度
gisGcj02Lng //高德坐标系-经度
gisBd09Lat //百度坐标系-纬度
gisBd09Lng //百度坐标系-经度
样式三——省市区三级列表
0、预先加载数据
在自定义的Application中或者Activity中添加以下的代码,预先加载本地城市数据
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
/**
* 预先加载三级列表显示省市区的数据
*/
CityListLoader.getInstance().loadProData(this);
}
}
1、跳转到省份列表
//跳转到省份列表
Intent intent = new Intent(this, ProvinceActivity.class);
startActivityForResult(intent, ProvinceActivity.RESULT_DATA);
2、添加结果返回
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == ProvinceActivity.RESULT_DATA) {
if (resultCode == RESULT_OK) {
if (data == null) {
return;
}
//省份结果
CityBean province = data.getParcelableExtra("province");
//城市结果
CityBean city = data.getParcelableExtra("city");
//区域结果
CityBean area = data.getParcelableExtra("area");
}
}
}
3、数据结构
//城市id
private String id;
//城市name
private String name;
通过 startActivityForResult 来获取选择的三级城市列表结果, 以上代码为固定格式,不可改变,直接copy 即可!!!
代码混淆
-keep class com.lljjcoder.**{
*;
}
-dontwarn demo.**
-keep class demo.**{*;}
-dontwarn net.sourceforge.pinyin4j.**
-keep class net.sourceforge.pinyin4j.**{*;}
-keep class net.sourceforge.pinyin4j.format.**{*;}
-keep class net.sourceforge.pinyin4j.format.exception.**{*;}