是采用的github开源库PickerView,省时省力。最终效果图见最后

首先添加依赖:

//PickerView 选择器
implementation 'com.contrarywind:Android-PickerView:4.1.9'
//谷歌Gson
implementation 'com.google.code.gson:gson:2.8.6'
//eventbus
implementation 'org.greenrobot:eventbus:3.2.0'

Gson是在解析地址文件的时候要用,eventbus是传递选择的数据的时候要用。

因为他给的布局通常是不太符合你实际需求的,所以使用自定义布局的方式,先去写好自己的布局文件,如地址的

picker_location.xml

因为有多个地方要重用选择器的部分,所以我使用include方便重用:

include_picker_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="280dp"android:background="@drawable/shape_picker_bg"><TextViewandroid:id="@+id/include_picker_tv_cancle"android:layout_width="30dp"android:layout_height="30dp"android:text="取消"android:textSize="14dp"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:textColor="@color/black_1A"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/include_picker_tv_submit"android:layout_width="30dp"android:layout_height="30dp"android:text="确定"android:textSize="14dp"android:layout_marginRight="20dp"android:layout_marginTop="20dp"android:textColor="@color/gray_9A"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /><LinearLayoutandroid:id="@+id/optionspicker"android:layout_width="match_parent"android:layout_height="wrap_content"android:minHeight="150dp"android:gravity="center"android:background="@android:color/white"android:orientation="horizontal"android:layout_marginTop="20dp"app:layout_constraintTop_toTopOf="parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"><com.contrarywind.view.WheelViewandroid:id="@+id/options1"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><com.contrarywind.view.WheelViewandroid:id="@+id/options2"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><com.contrarywind.view.WheelViewandroid:id="@+id/options3"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>

我将这几个封装成了一个工具类,其中显示地址的代码:

private OptionsPickerView locationOptions;
//显示地址选择器public void showLocationPicker() {// 弹出选择器if(!isLoaded){Toast.makeText(context,context.getResources().getString(R.string.loading_location_data),Toast.LENGTH_SHORT).show();return;}locationOptions = new OptionsPickerBuilder(context, new OnOptionsSelectListener() {@Overridepublic void onOptionsSelect(int options1, int options2, int options3, View v) {//}}).setLayoutRes(R.layout.picker_location, new CustomListener() {@Overridepublic void customLayout(View v) {final TextView tvSubmit = v.findViewById(R.id.picker_location_inc_bg).findViewById(R.id.include_picker_tv_submit);final TextView tvCancle = v.findViewById(R.id.picker_location_inc_bg).findViewById(R.id.include_picker_tv_cancle);tvSubmit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(!isChanged){//没有改变默认选择第一项String firstLocation = options1Items.get(0).getPickerViewText() + "\t" +  options2Items.get(0).get(0);EventBus.getDefault().post(new PickerMessageEvent(MESSAGE_TYPE_LOCATION,firstLocation,"0"));}else {EventBus.getDefault().post(new PickerMessageEvent(MESSAGE_TYPE_LOCATION,checkedLocation,"0"));}locationOptions.dismiss();}});}}).setOptionsSelectChangeListener(new OnOptionsSelectChangeListener() {@Overridepublic void onOptionsSelectChanged(int options1, int options2, int options3) {String opt1tx = options1Items.size() > 0 ?options1Items.get(options1).getPickerViewText() : "";String opt2tx = options2Items.size() > 0&& options2Items.get(options1).size() > 0 ?options2Items.get(options1).get(options2) : "";checkedLocation = opt1tx + "\t" + opt2tx;isChanged = true;}}).setLineSpacingMultiplier(2.4f)//设置距离.setItemVisibleCount(3)//设置显示的数据数量.setContentTextSize(17)//设置标题字号.isRestoreItem(true)//是否每次从头开始显示数据.isAlphaGradient(true).build();locationOptions.setPicker(options1Items, options2Items);locationOptions.show();}//初始化地区数据private void initJsonData() {//解析数据/*** 注意:assets 目录下的Json文件仅供参考,实际使用可自行替换文件* 关键逻辑在于循环体** */String JsonData = new GetJsonDataUtil().getJson(context, "province.json");//获取assets目录下的json文件数据ArrayList<JsonBean> jsonBean = parseData(JsonData);//用Gson 转成实体/*** 添加省份数据** 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口,* PickerView会通过getPickerViewText方法获取字符串显示出来。*/options1Items = jsonBean;for (int i = 0; i < jsonBean.size(); i++) {//遍历省份ArrayList<String> cityList = new ArrayList<>();//该省的城市列表(第二级)ArrayList<ArrayList<String>> province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极)for (int c = 0; c < jsonBean.get(i).getCityList().size(); c++) {//遍历该省份的所有城市String cityName = jsonBean.get(i).getCityList().get(c).getName();cityList.add(cityName);//添加城市
//                ArrayList<String> city_AreaList = new ArrayList<>();//该城市的所有地区列表//如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃/*if (jsonBean.get(i).getCityList().get(c).getArea() == null|| jsonBean.get(i).getCityList().get(c).getArea().size() == 0) {city_AreaList.add("");} else {city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());}*/
//                city_AreaList.addAll(jsonBean.get(i).getCityList().get(c).getArea());
//                province_AreaList.add(city_AreaList);//添加该省所有地区数据}/*** 添加城市数据*/options2Items.add(cityList);/*** 添加地区数据*/
//            options3Items.add(province_AreaList);}mHandler.sendEmptyMessage(MSG_LOAD_SUCCESS);}//解析地区json文件public ArrayList<JsonBean> parseData(String result) {//Gson 解析ArrayList<JsonBean> detail = new ArrayList<>();try {JSONArray data = new JSONArray(result);Gson gson = new Gson();for (int i = 0; i < data.length(); i++) {JsonBean entity = gson.fromJson(data.optJSONObject(i).toString(), JsonBean.class);detail.add(entity);}} catch (Exception e) {e.printStackTrace();mHandler.sendEmptyMessage(MSG_LOAD_FAILED);}return detail;}public void removeHandler(){if (mHandler != null) {mHandler.removeCallbacksAndMessages(null);}}

其中

String JsonData = new GetJsonDataUtil().getJson(context, "province.json");//获取assets目录下的json文件数据

是一份地址数据文件放在本地assets。

JsonBean和GetJsonDataUtil请参照源码,不过多解释。

最后效果:

         

自己需要什么样的效果就通过布局文件和locationOptions.set...去设置

源码://download.csdn.net/download/qq_37980878/12582869

Android 选择器 PickerView实例,时间选择器、地址选择器、单项选择器、多项选择器自定义布局相关推荐

  1. android双日期选择器,AndroidPicker 安卓选择器类库,包括日期选择器、时间选择器、单项选择器、双项选择器、城市地址选择器、车牌号选择器 @codeKK Android开源站...

    安卓选择器类库,包括日期及时间选择器(可设置范围).单项选择器(可用于性别.职业.学历.星座等).城市地址选择器(分省级.地级及县级).数字选择器(可用于年龄.身高.体重.温度等).双项选择器.颜色选 ...

  2. php地址选择插件,微信小程序中关于三级联动地址选择器的实例分享

    本文介绍了微信小程序三级联动地址选择器的实例代码,分享给大家,有需要的可以一起了解一下 在一些电商类的小程序中,地址选择这个功能一般是必备的,一般的收货信息都需要有一个能选择省市县的控件,当然也有些人 ...

  3. android自定义滚轴选择器_Android自定义控件实战—滚动选择器PickerView

    手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器,前几天用手机刷了MIUI,发现自带的那个时间选择器效果挺好看的,于是就自己仿写了一个,权当练手.先来看效果: 效果还行吧?实现思路就是自定 ...

  4. Android自定义控件实战——滚动选择器PickerView

    转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38513301 手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器, ...

  5. Android --- 进入页面时,不弹出软键盘。当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等

    功能需求: 1.进入页面时,不弹出软键盘 2.当 EditText 被点击时不弹出软键盘,而是调用其他选择器,比如时间选择器等 搜索百度测试: 1.百度上说用 editText.setInputTyp ...

  6. ios 时间选择器月份设置中文_iOS 自定义日期选择器  PickerView优化版

    // rgb颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue ...

  7. vue滑动选择器(一键开启时间选择器)

    vue滑动选择器(一键开启时间选择器) 一个vue的滑动选择器(移动端和PC端都能使用) 先来张效果图 安装 npm install time_check_jiangji 引入 import Time ...

  8. 《ArcGIS Engine+C#实例开发教程》第七讲 图层符号选择器的实现2

    <ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 原文:<ArcGIS Engine+C#实例开发教程>第七讲 图层符号选择器的实现2 摘要:在第 ...

  9. DateTimePicker 日期时间选择器设置默认时间

    DateTimePicker 日期时间选择器设置默认时间 default-value属性接受一个数组,第一项为开始时间,第二项为结束时间,时间格式为:"YY-mm-dd HH:mm:ss&q ...

最新文章

  1. C3F:首个开源人群计数算法框架
  2. sql必知必会样例表导入失败_记录WordPress搬家遇到的数据库导入错误问题
  3. python推荐系统-RecQ-Python推荐系统框架
  4. django mysql connector,MySQL Connector / Python作为Django引擎?
  5. 1.5.2 在IIS上配置ASP.NET(转)
  6. LeetCode 426. 将二叉搜索树转化为排序的双向链表(BST中序循环遍历)
  7. 【Git】Git处理新Repository无法push的问题
  8. 12 种经典亿级流量架构之资源隔离思想与方法论
  9. String StringBuilder StringBuffer
  10. Daily Scrum10 11.14
  11. Chrome 开发者工具网络性能使用
  12. 笨办法学Python(learn python the hard way)--练习程序39-40
  13. 【原创】SSAS-引用维度与多数据源、多数据源视图引发分区错误
  14. 产品配件类目税目分类_汽车用品税收分类编码
  15. Java_接口练习题
  16. Excel表格的基本操作,包含制作一个表格的全部知识
  17. 计算机界面视频录制软件,视频录制工具怎么用?这样的电脑录屏方法超实用!...
  18. 支付宝登录java_支付宝登录java和android
  19. PB调用DLL的常见问题及处理方法
  20. 【RDMA】IBV_SEND_INLINE和IBV_SEND_SIGNALED的原理|RDMA小消息通信性能优化

热门文章

  1. Shrinkage Loss
  2. JSON.stringify()和JSON.parse()
  3. 阻抗匹配四种处理方式
  4. 威学一百_威学一百安卓版下载-威学一百app下载v1.0.0-聚侠网
  5. 关于程序猿 59 条搞笑但却真实无比的语录
  6. Bluetooth Controller BB Phsical Channel相关基础知识整理
  7. 笛卡尔坐标系中八个卦限对应的位置
  8. java rmi tcp_Tomcat启动失败报错[RMI TCP Connection(4)-127.0.0.1] [RMI TCP Connection(3)-127.0.0.1]...
  9. centos7 安装Google Chrome浏览器
  10. Keras: 创建多个输入以及混合数据输入的神经网络模型