近期的一个项目由于android端与IOS端须要同步,所以在城市选择器这里做了一个相似IOS的CityPicker控件,当然由于本人水平问题显示效果比IOS上面还是有一定差距的。OK先让大家看下效果。

由于项目中是一个两级连选,所以这个DEMO仅仅用也就没有放上县级的数据。假设有须要实现三级连选的朋友。能够參照代码加上即可了。

内部使用的WheelView控件来自https://github.com/wangjiegulu/WheelView,在他的基础上进行和一些改动了备注,使他更适合于进行3级的城市连选,须要的朋友能够下载下来看一下。

附上部分代码片段。

数据的获取,全部的数据来自于CityManage对象。
public class CityManage { private SQLiteDatabase database; public CityManage(Context context){
database = CityDatabase.openDatabase(context); } /**
* 获取全部的省市名称
*/
public List<String> getAllNames(){
List<String> result = new ArrayList<>(); Cursor cursor = database.query("region",new String[]{"name"},null,null,null,null,null); while (cursor.moveToNext()){
result.add(cursor.getString(0)); } return result;
} /**
* 获取全部省的名称
*/
public List<String> getProvinceNames(){
List<String> result = new ArrayList<>(); Cursor cursor = database.query("region",new String[]{"name"},"parent_id = 1",null,null,null,null,null); while (cursor.moveToNext()){
result.add(cursor.getString(0)); } return result;
} /**
* 依据省市的ID获取省市的名称
*/
public String getProvinceNameFromProvinceId(String provinceId){
String result = "找不到桑";
Cursor cursor = database.query("region",new String[]{"name"},"region_id = ? ",new String[]{provinceId},null,null,null,null);
while (cursor.moveToNext()){
result = cursor.getString(0); } return result;
} /**
* 依据省市的名称获取省市的ID
*/
public String getProvinceIdFromProvinceName(String provinceName){
String result = "找不到桑";
Cursor cursor = database.query("region",new String[]{"region_id"},"name = ?",new String[]{provinceName},null,null,null,null);
while (cursor.moveToNext()){
result = cursor.getString(0); } return result;
} /**
* 依据省的ID获取它包括的全部市的名称
*/
public List<String> getCityNameFromProvinceId(String provinceId){
List<String> result = new ArrayList<>(); Cursor cursor = database.query("region",new String[]{"name"},"parent_id = ?",new String[]{provinceId},null,null,null,null); while (cursor.moveToNext()){
result.add(cursor.getString(0)); } return result;
} /**
* 依据省的ID获取它包括的全部市的模型
*/
public List<CityModel> getCityModelFromProvinceId(String provinceId){
List<CityModel> result = new ArrayList<>(); Cursor cursor = database.query("region",null,"parent_id = ?",new String[]{provinceId},null,null,null,null); while (cursor.moveToNext()){
CityModel cityModel = new CityModel(); //城市ID
int indexId = cursor.getColumnIndex("region_id");
cityModel.setCityId(cursor.getString(indexId)); //城市名
int indexCityName = cursor.getColumnIndex("name");
cityModel.setCityName(cursor.getString(indexCityName)); //所属省ID
int indexProvinceId = cursor.getColumnIndex("parent_id");
cityModel.setProvinceId(cursor.getString(indexProvinceId)); //所属省名称
cityModel.setProvinceName(getProvinceNameFromProvinceId(cityModel.getProvinceId())); result.add(cityModel); } return result;
} /**
* 依据省市的ID获取省市的模型
*/
public CityModel getCityModelFormCityId(String cityId){
CityModel result = new CityModel(); Cursor cursor = database.query("region",null,"region_id = ? ",new String[]{cityId},null,null,null,null); while (cursor.moveToNext()){
//城市ID
int indexId = cursor.getColumnIndex("region_id");
result.setCityId(cursor.getString(indexId)); //城市名
int indexCityName = cursor.getColumnIndex("name");
result.setCityName(cursor.getString(indexCityName)); //所属省ID
int indexProvinceId = cursor.getColumnIndex("parent_id");
result.setProvinceId(cursor.getString(indexProvinceId)); //所属省名称
result.setProvinceName(getProvinceNameFromProvinceId(result.getProvinceId()));
} return result;
} /**
* 依据省市的名称获取省市的模型
*/
public CityModel getCityModelFormCityName(String cityName){
CityModel result = new CityModel(); Cursor cursor = database.query("region",null,"name = ?",new String[]{cityName},null,null,null,null); while (cursor.moveToNext()){
//城市ID
int indexId = cursor.getColumnIndex("region_id");
result.setCityId(cursor.getString(indexId)); //城市名
int indexCityName = cursor.getColumnIndex("name");
result.setCityName(cursor.getString(indexCityName)); //所属省ID
int indexProvinceId = cursor.getColumnIndex("parent_id");
result.setProvinceId(cursor.getString(indexProvinceId)); //所属省名称
result.setProvinceName(getProvinceNameFromProvinceId(result.getProvinceId()));
} return result;
} }
连选关键
wvProvince.setOnWheelViewListener(new WheelView.OnWheelViewListener(){
@Override
public void onSelected(int selectedIndex, String item) {
super.onSelected(selectedIndex, item); //又一次初始化城市数据
cityList = cityManage.getCityNameFromProvinceId(cityManage.getProvinceIdFromProvinceName(item));
//替换显示数据
wvCity.replace(cityList);
wvCity.setSeletion(0);
}
});

对这个有兴趣的朋友把源代码下载下来看一下。

源代码下载地址: http://download.csdn.net/detail/u011068996/8983575


站在巨人的肩膀上,我们才干看得更远

AndroidCityPicker仿IOS选择效果的更多相关文章

  1. Android仿IOS回弹效果 ScrollView回弹 总结

    Android仿IOS回弹效果  ScrollView回弹 总结 应项目中的需求  须要仿IOS 下拉回弹的效果 , 我在网上搜了非常多 大多数都是拿scrollview 改吧改吧 试了一些  发现总 ...

  2. Android 实现高仿iOS桌面效果之可拖动的GridView(上)

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/40074663,作者:skay      最近项目中遇到一个LIstview的拖动效 ...

  3. Android-PickerView【仿iOS的PickerView控件,并封装了时间选择和选项选择这两种选择器】使用

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文主要演示Android-PickerView的选项选择器.时间选择器的简单运用.由于每一个版本略有不用,所以实际使用方式以git ...

  4. jquery仿淘宝规格颜色选择效果

    jquery实现的仿淘宝规格颜色选择效果源代码如下 jquery仿淘宝规格颜色选择效果 -收缩HTML代码 运行代码 [如果运行无效果,请自行将源代码保存为html文件运行] <script t ...

  5. 商城项目实战 | 1.1 Android 仿京东商城底部布局的选择效果 —— Selector 选择器的实现

    前言 本文为菜鸟窝作者刘婷的连载."商城项目实战"系列来聊聊仿"京东淘宝的购物商城"如何实现. 京东商城的底部布局的选择效果看上去很复杂,其实很简单,这主要是要 ...

  6. iOS仿支付宝首页效果

    代码地址如下:http://www.demodashi.com/demo/12776.html 首先看一下效果 状态栏红色是因为使用手机录屏的原因. 1.问题分析 1.导航栏A有两组控件,随着tabl ...

  7. 在uwp仿IOS的页面切换效果

    有时候我们需要编写一些迎合IOS用户使用习惯的uwp应用,我在这里整理一下仿IOS页面切换效果的代码. 先分析IOS的页面切换.用户使用左右滑动方式进行前进和后退,播放类似于FlipView的切换动画 ...

  8. 自己定义控件:onDraw 方法实现仿 iOS 的开关效果

    概述 本文主要解说怎样在 Android 下实现高仿 iOS 的开关按钮,并不是是在 Android 自带的 ToggleButton 上改动,而是使用 API 提供的 onDraw.onMeasur ...

  9. uni-app自定义Modal弹窗组件|仿ios、微信弹窗效果

    介绍 uniapp自定义弹窗组件uniPop,基于uni-app开发的自定义模态弹窗|msg信息框|alert对话框|confirm确认框|toast弱提示框 支持多种动画效果.多弹窗类型ios/an ...

随机推荐

  1. 【LeetCode】To Lower Case(转换成小写字母)

    这道题是LeetCode里的第709道题. 题目要求: 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串. 示例 1: ...

  2. tensorflow在各种环境下搭建与对比

    tensorflow在各种环境下搭建与对比 由于有些训练是要长时间进行训练(几天),才能看出显著的结果,如果只是通过本地的计算机进行训练是不可能的.因此这周花了一些时间调研如何才能让神经网络长时间的进 ...

  3. hdu2022

    #include <stdio.h> #include <math.h> #define here puts("go,go,go!\n") int main ...

  4. sqlserver查询表大小

    IF OBJECT_ID('tempdb..#TB_TEMP_SPACE') IS NOT NULL DROP TABLE #TB_TEMP_SPACE GO CREATE TABLE #TB_TEM ...

  5. iOS学习笔记11-多线程入门

    一.iOS多线程 iOS多线程开发有三种方式: NSThread NSOperation GCD iOS在每个进程启动后都会创建一个主线程,更新UI要在主线程上,所以也称为UI线程,是其他线程的父线程 ...

  6. UOJ 34 多项式乘法 ——NTT

    [题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...

  7. Codeforces787D - Legacy

    Description \(n(n\leq10^5)\)个点构成的有向图,有\(m(m\leq10^5)\)条连通信息,信息有三种: 1 u v w,表示存在一条边权为\(w\)的有向边\((u,v) ...

  8. 算法复习——序列分治(ssoj光荣的梦想)

    题目: 题目描述 Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯.在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界.保卫这里的平衡与和谐.在那个时 ...

  9. 【最优K叉树】hdu 5884 Sort

    http://acm.hdu.edu.cn/showproblem.php?pid=5884 参考:https://www.cnblogs.com/jhz033/p/5879452.html [题意] ...

  10. css3鼠标点击穿透--摘抄

    有些时候网页中用到了一些绝对定位的Div,因为需要事先这个Div是隐藏的,但是它所在的位置会遮挡住鼠标点击事件.这个时候可以用CCS3中的pointer-events属性来解决.   //穿透该层 p ...