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

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

1.开始编写

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

compile 'com.bigkoo:pickerview:2.0.8'

2).项目的目录结构

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

怎样使用pickerview来实现地址菜单的三级联动效果_第1张图片

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 provinceList = new ArrayList<>();//创建存放省份实体类的集合

    private ArrayList cities ;//创建存放城市名称集合
    private ArrayList> citiesList= new ArrayList<>();//创建存放城市名称集合的集合

    private ArrayList areas ;//创建存放区县名称的集合
    private ArrayList> areasList ;//创建存放区县名称集合的集合
    private ArrayList>> 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

你可能感兴趣的:(第三方控件)