前言:在项目中现在地区和日期选择器运用的非常多,刚好前段时间也在项目中使用了这俩个。今天就为大家简单介绍一下wheelview的简单方法以及实现其功能和重写其适配器来嵌套自己的数据的。
先来说说WheelView,WheelView是在github上面的一个开源框架,地址我就不给了,自己百度一下。他很好的解决了滚动之间相互监听以及UI设计,感兴趣的可以自己去github上面mark下来或者下载我的源码研究研究。这里我就不多说了,毕竟大神写出来了,我们要会用才行。好了 现在就开始介绍一下wheelview的一些简单而且常用的方法
1.setViewAdapter 这个方法和listview的adapter是一样的 就是给wheelview设置数据,在这里简单介绍一下我源码中使用的俩个适配器
-----------------①NumericWheelAdapter:这个适配器有四个属性 Context context(上下文菜单) int minValue(最小的数,就是从多少开始) int maxValue(最大数,就是到哪结束), String format(字符,在我的源码里,我修改了这个东西,让他返回的数值为 num+format(num为最小值和最大值之间的值),在他的源码中,只要你传入了format,他就只返回format,所以我进行了修改,毕竟我们需要传入的是1991年-2200年)
------------------②ArrayWheelAdapter :俩个属性 Context context(上下文菜单) T items[](数据数组),因为我的地区是将数据解析成了对象数组,所有这边我没有做什么修改。如果你的数据是List数据,那么你可以重写其的适配器,定义自己的数据适配器。具体方法可以参考ArrayWheelAdapter 类自己定义
2.setCurrentItem 默认选中的列,传入数据的索引即可
3.addChangingListener (很重要的方法) 每个WheelView的滚动监听事件,只要你滚动了WheelView就会调用这个监听事件,所以也是在这里进行我们滚动事件的逻辑处理,比如从北京-------->上海,那么我们就需要获取到上海的城市的数据,然后刷新二级列表,就是重新setViewAdapter ,将数据填充进去。
4.setCyclic 设置是否循环滚动 true循环滚动,false不循环
5.setVisibleItems 设置显示多少列(个人建议为7,因为设置为5或者其他,或出现覆盖的数据颜色变化不是很大,体验有点不好)
好了大体的方法就是这些了,使用了上面几个方法后我们就可以实现我们的地区和日期选择了,先上效果图
效果图代码在我资源里面,欢迎大家下载。
现在说说我的实现思路:首先自定义PopWindow,在Pop中实现WheelView的布局以及处理其中的关系。比如给适配器赋值,滚动的监听等等,都在Pop里面实现了 而在Activity中只要实现一下代码就可以了
if (cityPopWindow == null) {
cityPopWindow = new CityPopWindow(getApplicationContext());
cityPopWindow.setOnCityListener(MainActivity.this);
}
cityPopWindow.showAtLocation(main, Gravity.CENTER
| Gravity.BOTTOM, 0, 0);
private void setUpListener() {
// 添加change事件
mViewProvince.addChangingListener(this);
// 添加change事件
mViewCity.addChangingListener(this);
// 添加change事件
mViewDistrict.addChangingListener(this);
}
private void setUpData() {
initProvinceDatas();
mViewProvince.setViewAdapter(new ArrayWheelAdapter(context, mProvinceDatas));
updateCities();
updateAreas();
}
/**
* 根据当前的省,更新市WheelView的信息
*/
private void updateCities() {
int pCurrent = mViewProvince.getCurrentItem();
mCurrentProviceName = mProvinceDatas[pCurrent];
String[] cities = mCitisDatasMap.get(mCurrentProviceName);
if (cities == null) {
cities = new String[] { "" };
}
mViewCity.setViewAdapter(new ArrayWheelAdapter(context, cities));
mViewCity.setCurrentItem(0);
updateAreas();
}
/**
* 根据当前的市,更新区WheelView的信息
*/
private void updateAreas() {
int pCurrent = mViewCity.getCurrentItem();
mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent];
String[] areas = mDistrictDatasMap.get(mCurrentCityName);
if (areas == null) {
areas = new String[] { "" };
}
mViewDistrict.setViewAdapter(new ArrayWheelAdapter(context, areas));
mViewDistrict.setCurrentItem(0);
}
/* (non-Javadoc)
* @see com.wheelviewcity.OnWheelChangedListener#onChanged(com.wheelviewcity.WheelView, int, int)
*/
@Override
public void onChanged(WheelView wheel, int oldValue, int newValue) {
if (wheel == mViewProvince) {
updateCities();
} else if (wheel == mViewCity) {
updateAreas();
} else if (wheel == mViewDistrict) {
mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[newValue];
mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName);
}
pcw.SaveData(mCurrentProviceName+" "+mCurrentCityName+" "+mCurrentDistrictName);
}
private PopCityWindow pcw;
public void setOnCityListener(PopCityWindow pcw) {
this.pcw = pcw;
}
//自定义回调接口
public interface PopCityWindow {
void SaveData(String city);
}
注释还是比较多的,如果实在不懂,就
下载源码 或者在下面留言一起讨论。
使用WheelView无法该变其背景色 这个问题一直困扰着我 希望解决了的博友能留言一下。在这里还有一个开源项目也能实现滚动图,就是 LooperView,不过最近我这边使用的时候出现了一点BUG,正在解决,等我解决了,再来和大家讨论。