废话:公司前段事件,用到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的方式。
样式图:
,其他的不清楚的,可以去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
}
}好啦,写完了。但愿没有错别字。