CityPicker 城市选择器 教程

jacksky
发布于 2021-8-18 11:46
浏览
0收藏

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. 具体用法

可参考demo使用方法

 

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.**{*;}

 

 

已于2021-8-18 11:46:37修改
收藏
回复
举报
回复
    相关推荐