CityPicker 城市选择器指南

CityPicker 城市选择器指南

citypickercitypicker城市选择器,详细的省市区地址信息,支持仿iOS滚轮实现,仿京东样式,一级或者三级列表展示方式。项目地址:https://gitcode.com/gh_mirrors/ci/citypicker

1. 项目介绍

CityPicker 是一款专为 Android 设计的轻量级城市选择库,它提供省市区三级联动的功能,使得用户能够快速便捷地选取所需的城市信息。该项目旨在简化开发者在实现地理位置选择界面的工作,具有易于集成和高度可定制的特点。

2. 项目快速启动

添加依赖

build.gradle 文件的 dependencies 部分添加以下依赖:

implementation 'com.crazyandcoder:citypicker:latest_version'

替换 latest_version 为你找到的最新版本号。

使用示例

在 XML 布局文件中添加 CityPicker 控件:

<com.crazyandcoder.citypicker.CityPicker
    android:id="@+id/city_picker"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

在对应的 Activity 或 Fragment 中初始化并设置监听器:

CityPicker picker = findViewById(R.id.city_picker);
picker.setOnItemSelectedListener(new CityPicker.OnItemSelectedListener() {
    @Override
    public void onItemSelected(CityModel city) {
        // 在这里处理选定城市后的逻辑
        Log.d("CityPicker", "Selected City: " + city.getFullLocation());
    }

    @Override
    public void onCancel() {
        // 用户取消选择时触发
        Log.d("CityPicker", "Selection cancelled");
    }
});

3. 应用案例和最佳实践

在实际应用中,你可以通过定制主题、布局和数据源来适应不同的UI风格。例如,为提高用户体验,可以在选择完成后更新用户的个人资料或地图位置。在初始化时加载用户已保存的地址,实现自动选择。

此外,为了保证流畅的滚动体验,确保在后台线程预加载所有城市数据。避免在主线程进行大数据操作,以免影响界面性能。

4. 典型生态项目

  • 示例应用:https://github.com/crazyandcoder/citypicker-sample
  • 第三方扩展:https://github.com/search?q=citypicker+android&type=Repositories

这个开源项目已经催生了许多相关的生态系统项目,包括不同样式的扩展、国际化支持及与其他第三方库的整合等。你可以在 GitHub 上搜索 citypicker android 查找更多的相关实现和示例。


以上就是关于 CityPicker 的介绍和使用指导,希望对你在开发过程中集成城市选择功能有所帮助。如需了解更多详情,欢迎查阅项目官方仓库及其文档。

citypickercitypicker城市选择器,详细的省市区地址信息,支持仿iOS滚轮实现,仿京东样式,一级或者三级列表展示方式。项目地址:https://gitcode.com/gh_mirrors/ci/citypicker

好的,以下是基于uniapp的城市选择器封装代码: 1. 在components文件夹下新建一个CityPicker文件夹,里面新建CityPicker.vue文件: ``` <template> <div class="city-picker"> <van-picker :columns="columns" @change="onChange" @confirm="onConfirm" @cancel="onCancel" > <template #title> <div class="city-picker-header"> <van-icon name="arrow-left" size="20" @click="onCancel" /> <span class="city-picker-title">{{title}}</span> </div> </template> </van-picker> </div> </template> <script> import { mapState } from 'vuex'; export default { props: { title: { type: String, default: '选择城市' }, visible: { type: Boolean, default: false }, value: { type: Array, default() { return [null, null, null]; } } }, computed: mapState({ cityData: state => state.city.cityData }), data() { return { columns: [ { values: [] }, { values: [] }, { values: [] } ], currentProvince: '', currentCity: '', currentDistrict: '' }; }, methods: { initColumns() { const { columns } = this; const provinceList = Object.keys(this.cityData); const province = this.currentProvince || provinceList[0]; const city = this.currentCity || Object.keys(this.cityData[province])[0]; const district = this.currentDistrict || this.cityData[province][city][0]; columns[0].values = provinceList; columns[1].values = Object.keys(this.cityData[province]); columns[2].values = this.cityData[province][city]; columns.forEach(column => { column.defaultIndex = 0; }); this.currentProvince = province; this.currentCity = city; this.currentDistrict = district; }, onChange(picker, value) { const { cityData, columns } = this; const province = columns[0].values[value[0]]; const city = columns[1].values[value[1]]; const district = columns[2].values[value[2]]; if (cityData[province][city].indexOf(district) === -1) { columns[2].values = cityData[province][city]; } }, onConfirm() { this.$emit('input', [ this.currentProvince, this.currentCity, this.currentDistrict ]); this.$emit('confirm', [ this.currentProvince, this.currentCity, this.currentDistrict ]); }, onCancel() { this.$emit('cancel'); } }, watch: { visible(val) { if (val) { this.initColumns(); } }, columns: { deep: true, handler(val) { const { cityData } = this; const province = val[0].values[val[0].defaultIndex]; const city = val[1].values[val[1].defaultIndex]; const district = val[2].values[val[2].defaultIndex]; if (cityData[province][city].indexOf(district) === -1) { val[2].values = cityData[province][city]; this.currentDistrict = cityData[province][city][0]; } this.currentProvince = province; this.currentCity = city; this.currentDistrict = district; } } } }; </script> <style scoped> .city-picker { height: 300px; overflow: hidden; } .city-picker-header { display: flex; justify-content: space-between; align-items: center; padding: 10px; } .city-picker-title { font-weight: bold; font-size: 16px; } </style> ``` 2. 在store文件夹下新建一个city.js文件,里面写入城市数据: ``` export default { state: { cityData: { 北京市: { 北京市: [ '东城区', '西城区', '崇文区', '宣武区', '朝阳区', '丰台区', '石景山区', '海淀区', '门头沟区', '房山区', '通州区', '顺义区', '昌平区', '大兴区', '怀柔区', '平谷区', '密云县', '延庆县' ] }, 天津市: { 天津市: [ '和平区', '河东区', '河西区', '南开区', '河北区', '红桥区', '塘沽区', '汉沽区', '大港区', '东丽区', '西青区', '津南区', '北辰区', '武清区', '宝坻区', '宁河县', '静海县', '蓟县' ] }, 河北省: { 石家庄市: [ '长安区', '桥东区', '桥西区', '新华区', '井陉矿区', '裕华区', '井陉县', '正定县', '栾城县', '行唐县', '灵寿县', '高邑县', '深泽县', '赞皇县', '无极县', '平山县', '元氏县', '赵县', '辛集市', '藁城市', '晋州市', '新乐市', '鹿泉市' ], 唐山市: [ '路南区', '路北区', '古冶区', '开平区', '丰南区', '丰润区', '滦县', '滦南县', '乐亭县', '迁西县', '玉田县', '唐海县', '遵化市', '迁安市' ], 秦皇岛市: [ '海港区', '山海关区', '北戴河区', '青龙满族自治县', '昌黎县', '抚宁县', '卢龙县' ] }, 山西省: { 太原市: [ '小店区', '迎泽区', '杏花岭区', '尖草坪区', '万柏林区', '晋源区', '清徐县', '阳曲县', '娄烦县', '古交市' ], 大同市: [ '城区', '矿区', '南郊区', '新荣区', '阳高县', '天镇县', '广灵县', '灵丘县', '浑源县', '左云县', '大同县' ], 阳泉市: ['城区', '矿区', '郊区', '平定县', '盂县'] } } } }; ``` 3. 在pages文件夹下新建一个Index.vue文件,在里面调用CityPicker组件: ``` <template> <div class="container"> <van-field v-model="value" label="城市" placeholder="请选择城市" readonly @click="showPicker" /> <city-picker :visible.sync="show" :value.sync="value" @confirm="onConfirm" @cancel="onCancel" /> </div> </template> <script> import CityPicker from '@/components/CityPicker/CityPicker'; export default { components: { CityPicker }, data() { return { show: false, value: [null, null, null] }; }, methods: { showPicker() { this.show = true; }, onConfirm(value) { this.value = value; this.show = false; }, onCancel() { this.show = false; } } }; </script> <style scoped> .container { padding: 20px; } </style> ``` 这样一个封装好的城市选择器组件就完成了。可以根据自己的需要进行样式和功能的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱龙阔Philippa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值