现在很多的app,尤其是电商类的app在添加地址功能里面一般都会使用地址的三级联动,那么它是怎么实现的呢?其实很简单,现在简单的介绍一下使用第三方的依赖来实现三级联动的效果.

1.开始编写

1).在module的build.gradle文件中的dependencies节点里面添加这样一行代码引入依赖

compile 'com.bigkoo:pickerview:2.0.8'

2).项目的目录结构

包括assets资产目录,三个类文件,分别是activity的代码逻辑类,省份的实体类以及获取省份信息json字符串的工具类.

3)实体类编写如下:

public class AddressBean {public String name;public AddressBean(String name) {this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPickerViewText() {//这里是固定写法,依赖库会根据集合内容使用反射显示文本到省份栏的文本框中return this.name;}@Overridepublic String toString() {return "AddressBean{" +"name='" + name + '\'' +'}';}
}

4).获取json字符串的工具类代码

/*** Created by yangtao on 2016/12/11.* 从资产目录中获取json字符串*/public class JsonUtils {public static String getJsonString(Context context,String name){ByteArrayOutputStream baos = new ByteArrayOutputStream();AssetManager am = context.getAssets();try {InputStream inputStream = am.open(name);byte[] buffer = new byte[1024];int len =0;while((len = inputStream.read(buffer)) != -1){baos.write(buffer,0,len);}} catch (IOException e) {e.printStackTrace();}return baos.toString();}
}

5)MainActivity中的代码实现

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;import com.bigkoo.pickerview.OptionsPickerView;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private TextView tv_address;private ArrayList<AddressBean> provinceList = new ArrayList<>();//创建存放省份实体类的集合private ArrayList<String> cities ;//创建存放城市名称集合private ArrayList<List<String>> citiesList= new ArrayList<>();//创建存放城市名称集合的集合private ArrayList<String> areas ;//创建存放区县名称的集合private ArrayList<List<String>> areasList ;//创建存放区县名称集合的集合private ArrayList<List<List<String>>> areasListsList = new ArrayList<>();//创建存放区县集合的集合的集合private OptionsPickerView mPvOptions;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_address = (TextView) findViewById(R.id.tv_address);//获取json字符串,用来解析以获取集合String jsonString = JsonUtils.getJsonString(MainActivity.this,"province_data.json");//解析json字符串,向各级集合中添加元素parseJson(jsonString);mPvOptions = new OptionsPickerView(this);//设置三级联动的效果mPvOptions.setPicker(provinceList,citiesList,areasListsList,true);//设置可以循环滚动,true表示这一栏可以循环,false表示不可以循环mPvOptions.setCyclic(true,false,false);//设置默认选中的位置mPvOptions.setSelectOptions(0,0,0);mPvOptions.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {@Overridepublic void onOptionsSelect(int options1, int option2, int options3) {//返回的分别是三个级别的选中位置String city = provinceList.get(options1).getPickerViewText();String address;//  如果是直辖市或者特别行政区只设置市和区/县if ("北京市".equals(city) || "上海市".equals(city) || "天津市".equals(city) || "重庆市".equals(city) || "澳门".equals(city) || "香港".equals(city)) {address = provinceList.get(options1).getPickerViewText()+ " " + areasListsList.get(options1).get(option2).get(options3);} else {address = provinceList.get(options1).getPickerViewText()+ " " + citiesList.get(options1).get(option2)+ " " + areasListsList.get(options1).get(option2).get(options3);}tv_address.setText(address);Toast.makeText(MainActivity.this,"我被点击了",Toast.LENGTH_LONG).show();}});//点击文本框的时候,显示地址选择框tv_address.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mPvOptions.show();}});}//解析获得的json字符串,放在各个集合中private void parseJson(String json){try {//得到一个数组类型的json对象JSONArray jsonArray = new JSONArray(json);for (int i = 0; i < jsonArray.length(); i++) {//对数组进行遍历得到每一个jsonobject对象JSONObject provinceObject = (JSONObject) jsonArray.get(i);String provinceName = provinceObject.getString("name");//得到省份的名字provinceList.add(new AddressBean(provinceName));//向集合里面添加元素JSONArray cityArray = provinceObject.optJSONArray("city");cities = new ArrayList<>();//创建存放城市名称集合areasList = new ArrayList<>();//创建存放区县名称的集合的集合for (int j = 0; j < cityArray.length(); j++) {//遍历每个省份集合下的城市列表JSONObject cityObject = (JSONObject) cityArray.get(j);String cityName = cityObject.getString("name");cities.add(cityName);//向集合里面添加元素JSONArray areaArray = cityObject.optJSONArray("area");areas = new ArrayList<>();//创建存放区县名称的集合for (int k = 0; k < areaArray.length(); k++) {String areaName = areaArray.getString(k);areas.add(areaName);}areasList.add(areas);}citiesList.add(cities);areasListsList.add(areasList);}} catch (JSONException e) {e.printStackTrace();}}
}

2.注意:

1).这里要注意,在向集合中添加元素的时候要理清层级关系,for循环的嵌套处理要合理,否则可能会报下标越界的错误;

2).引入依赖的版本过高可能会引入失败,建议引入demo中提供的版本.

3).github项目地址:点击打开链接
4)demo的下载地址:地址列表三级联动demo

怎样使用pickerview来实现地址菜单的三级联动效果相关推荐

  1. php创建无限级树型菜单以及三级联动菜单

    http://www.php.cn/php-weizijiaocheng-373500.html 这篇文章主要介绍了php创建无限级树型菜单 ,主要使用的是递归函数,感兴趣的小伙伴们可以参考一下 写递 ...

  2. vue实现下拉二级联动_select下拉菜单实现二级联动效果

    需求:建立年级.班级两个数据表,获取年级表信息,根据年级,获取相应的班级 效果图: 不完美的地方就是在不选择年级的时候,是不能选择任何班级的. 代码部分 首先是建立两个表的实体 需要注意的就是写注解了 ...

  3. android 仿ios三级联动,仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果...

    Android-PickerView 注意事项.详请使用方式.更新日志等,请查看 Wiki文档 Wiki文档,Wiki文档,Wiki文档 !~ 重要的事情说三遍 对于使用上有任何疑问或优化建议等,欢迎 ...

  4. 微信小程序 实现美团外卖 菜单分类,左右联动 效果

    最近项目要求写一个美团菜单分类左右联动的需求 记录一下 1,首先 需要使用到 scroll-view 组件 左右2边 都需要滑动 直接上代码 scroll-into-view 值应为某子元素id(id ...

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

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

  6. vue实现省市区三级联动地址选择组件

    昨天收到一个新的需求,需要选择地址,因此就要做一个省市区三级联动的组件来使用,在网上找了一些资源,然后进行了尝试,没想到就这么成功了!要记录一下方便后续使用. 效果如下:  下面就记录一下代码叭! 一 ...

  7. ios收货地址三级联动选择

    这次的需求,是省市区三级联动选择,并且市的选择要根据省的id,然后区的选择要根据市的id 每次都要进行网络请求,关键代码,其实是 //监听轮子的移动 - (void)pickerView:(UIPic ...

  8. dropdownlist三级联动怎么实现_简单三步,轻松搞定一级、二级、三级下拉菜单

    工作中,为了录入数据方便,数据规范,我们经常采用下拉菜单来制作规范模板,今天,技巧君和大家分享一下一级.二级和三级联动下拉菜单制作方法,文末有示例文件下载方法哦! 下拉菜单示例 一级下拉菜单 一级下拉 ...

  9. python三级联动菜单_Excel–这才是三级联动下拉菜单的正确做法

    Excel–这才是三级联动下拉菜单的正确做法,跟二级联动菜单完全不同! 文章来源:企鹅号 - Excel学习世界 今天教大家制作三级联动下拉菜单. 很多同学以为三级联动下拉做法跟二级联动下拉菜单是一样 ...

最新文章

  1. python父类的类成员怎么定义_python如何找到哪些父类定义子对象的方法
  2. boost::spirit模块实现自定义karma计数器的测试程序
  3. 数据科学与python——Pandas统计分析基础(数据堆叠+数据清洗)
  4. 悬浮球多功能_一个悬浮球,怎么可以这么贴心~
  5. 微信广告任务平台源码运营版
  6. navigator工具_推荐!11个令人惊叹的前端开发工具,值得拥有
  7. qtableview删除选中行_如何批量删除PPT备注+如何修改模板信息
  8. npm的常用操作---npm工作笔记003
  9. Linux运维实战|大文件切割
  10. 计算机网络之A、B、C类网络地址
  11. 减速电机计算公式中功率(P),扭力(NM),转速(RPM),减速比(RATIO)四大因素互相转化的重要性
  12. 干货分享:5年SEO经验得来的101条总结
  13. DISCUZ!X1模板home空间模板修改说明home.php
  14. 仪表图形怎么用c语言写,科一仪表盘图标大全
  15. 计算机二进制存储单位,计算机中的存储单位你清楚吗
  16. vite使用vite-aliases插件配置路径别名
  17. 锻造宝剑!如何用一款手机打造一个移动渗透工具箱??
  18. java实现加权随机,负载均衡--加权随机算法(Weight Random)
  19. 50部不可不看的时空/穿越电影
  20. 图解angr中两种CFG的区别

热门文章

  1. 【庖丁解牛系列】 项目时间管理之前导图/单代号网络图
  2. Java基础----Java语言简介
  3. 七大原则+23种设计模式
  4. 来自日本的品质传承 工机控股发布新品牌HiKOKI战略
  5. 小学数学加减法测试软件,儿童数学练习智能出题系统
  6. J9数字论:什么是 DAO?DAO 的起源是什么
  7. 排序-----直接插入排序------带监视哨和不带监视哨
  8. 在Tomcat下部署Jenkins
  9. 【产品设计】ToB 增删改查显算传
  10. 数据分析——巧用ABtest,看杰伦和徐坤的流量之争