废话:公司前段事件,用到Popupwindow底部弹出实现三级联动,当时也是第一次见这个玩意,一脸懵逼。但是经过几天的探索终于实现了,所以写下这篇,对于需要这个功能

的人有所帮助。


正文:

   实现3级联动框架有我知道2个,一个比较坑,一个非常简单使用,如果你目前不想去深入研究只想速度完成这个功能的话,那么推荐使用这个:

compile 'com.bigkoo:pickerview:2.0.8' 

 直接帮你封装好popupwindow底部显示,非常简单。下面我列一下它Dome中的实现步骤,和代码。还有GitHua地址是;

 https://github.com/saiwu-bigkoo/Android-PickerView

代码:

// 省数据集合
    private ArrayList<String> mListProvince = new ArrayList<String>();
    // 市数据集合
    private ArrayList<ArrayList<String>> mListCiry = new ArrayList<ArrayList<String>>();
    // 区数据集合
    private ArrayList<ArrayList<ArrayList<String>>> mListArea = new ArrayList<ArrayList<ArrayList<String>>>();


//填充数据

initData(0);

       // 创建选项选择器对象
        mOpv=new OptionsPickerView<>(this);
        //设置标题
        mOpv.setTitle("选择城市");
        //设置三级联动
        mOpv.setPicker(mListProvince,mListCiry,mListArea,true);


        //设置是否循环滚动
        mOpv.setCyclic(false,false,false);
        //设置默认选中的三级项目
        mOpv.setSelectOptions(0,0,0);


        //监听确定选择按钮
        mOpv.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {
            @Override
            public void onOptionsSelect(int options1, int option2, int options3) {
                //返回的分别是三个级别选中的位置
                String tx=mListProvince.get(options1) +mListCiry.get(options1).get(option2)
                        +mListArea.get(options1).get(option2).get(options3);
                mCity.setText(tx);
            }
        });
        你只需要以上步骤就可以实现,注意一点,不需要xml文件。因为是底部弹出popupwindow的方式。

样式图:

android联动代码 android 多级联动_android

,其他的不清楚的,可以去githua上下载一个dome导入试试就明白了。


好了,长话短说。说说下面这个比较坑人的框架。我的项目用的也是这个。真是千辛万苦。

当然为什么我还要说下面这个框架呢,主要是它还是有很不错的地方,比如,有很多属性可以自己去设置,还有什么阴影啊。总之可以自己DIY。下面放

githua地址,这个库需要手动导入。

https://github.com/maarek/android-wheel 

首先说一下坑的地方。1.这个组件底层封装了适配器,并且有一个bug,不然你不放适配器只是加载布局会报错。

2.关于一个天坑bug。就是你需要去它的底层代码把wheelview这个类下的

currentItem =0;
改成-1,不然不能设置当前curentItem为0,否则会报错。切记。这是它代码的逻辑问题。
如果你把这个代码改了其他跟着dome写就好。还有一点可以注意下:
最好使用ArrayWheelAdapter。适配器,它的dome里city这个wheel控件使用的就是这个。
好了。
其他就不废话了,下面说说一点关于3级联动这个适配器添加数据问题。
数据问题:
首先,这个数据如何装没有标准答案。根据你需要添装的数据,遍历转化为对应的数据,或集合。
下面我提供一种思路。
首先,省份的名字要单独为一个list或数组。它只需要显示即可。然后关于城市的wheel就需要关系
对应的省名,所以在遍历省的时候,循环嵌套得到一个省对应的城市名数据,然后用map把对应关系
(省名,城市名集合)。
关于城市名与地区名的对应关系数据。我是直接get获得城市名下的list数据,不去第3层遍历。然后保存
在另一个Hashmap。然后等需要用到这个map时候再循环解析成对应的数组。当然你可以3层遍历循环得到
,保存起来。但是我不喜欢一次写这么多复杂逻辑在一堆。还有一般用到地区选择的就1,2次,没必要全部
了。当然,我是菜鸟。写的不好,或者误导了你们。望勿喷。
下面放一些简单的代码,方便理解:
/*
    省名
 */
ArrayList<AreaListData> areaListDatas =new ArrayList<AreaListData>();
private String[] provincenames;
private HashMap<String,String[]> provinces;
private HashMap<String,List<AreaListData.CBean.ABean>> citys;private void initWheelViewData() {
    provincenames =new String[areaListDatas.size()];
    citys=new HashMap<>();
    provinces=new HashMap<>();
    for (int i=0;i<areaListDatas.size();i++){
        AreaListData sheng = areaListDatas.get(i);
        String shengming = sheng.getP();
        provincenames[i] =shengming;
        List<AreaListData.CBean> shilist = sheng.getC();
        String [] citynames=new String[shilist.size()];
        for (int j=0;j<shilist.size();j++){
            AreaListData.CBean shi = shilist.get(j);
            String shiming = shi.getN();
            List<AreaListData.CBean.ABean> mengdians = shi.getA();//
            citynames[j]=shiming;
            citys.put(shiming,mengdians);//市-区  map
        }
        provinces.put(shengming,citynames);//省-市map
    }
}好啦,写完了。但愿没有错别字。