怎样使用pickerview来实现地址菜单的三级联动效果
来源:互联网 发布:算法设计与分析分治法 编辑:程序博客网 时间:2024/05/18 02:03
现在很多的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; } @Override public 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; @Override protected 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() { @Override public 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() { @Override public 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
0 0
- 怎样使用pickerview来实现地址菜单的三级联动效果
- 使用pickerview实现(省市区)地址选择器的三级联动
- Vue如何使用vue-area-linkage实现地址三级联动效果 很多时候我们需要使用地址三级联动,即省市区三级联动。网上有很多插件,在此介绍Vue的一款地区联动插件:vue-ar
- 使用ajax实现三级联动菜单
- 使用listview实现简单的三级地址联动选择器
- 使用js实现一个地址的三级联动
- JQuery实现的三级联动菜单
- angularjs实现地址的三级联动
- JS来实现省市县三级联动菜单
- JS来实现省市县三级联动菜单
- 安卓学习笔记---Android-PickerView实现 3D滚轮效果(时间选择器、省市区三级联动,单项选择效果)
- 安卓Spinner的三级联动菜单效果
- 读取本地json数据实现省市区三级联动PickerView
- AJAX实现三级菜单联动
- jquery实现三级联动效果
- 省市区三级联动菜单实现及三级联动下拉列表框默认值的设置
- JS +XML +Jquery 实现三级联动菜单,自己封装的一个对象方便使用
- 使用dropkick.js插件实现省市区三级联动效果
- 我博客里用到的android各种Util文件
- 利用开源软件 Hugin 实现照片的景深合成
- hadoop入门-Mapreduce程序相关日志
- JAVA 入门学习之路-注册登录案例。
- eclipse插件版本或路径更改后的异常处理:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer
- 怎样使用pickerview来实现地址菜单的三级联动效果
- 请问ASP中如何判断记录集为空
- setuid,seteuid,setreuid
- Caffe 训练 cifar10 详细过程
- Android版本更新提示框
- 剑指offer编程题01
- 15.处理图像(案例:验证码+缩略图+加载系统字体+加载已有的图片)
- 数据结构实验之查找七:线性之哈希表
- MS SQL性能测试