Android 地区和日期选择器(附源码)

前言:在项目中现在地区和日期选择器运用的非常多,刚好前段时间也在项目中使用了这俩个。今天就为大家简单介绍一下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);

下面是我CityPopWindow类的部分代码

private void setUpListener() {
    	// 添加change事件
    	mViewProvince.addChangingListener(this);
    	// 添加change事件
    	mViewCity.addChangingListener(this);
    	// 添加change事件
    	mViewDistrict.addChangingListener(this);
    }
	
    private void setUpData() {
		initProvinceDatas();
		mViewProvince.setViewAdapter(new ArrayWheelAdapter<String>(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<String>(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<String>(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,正在解决,等我解决了,再来和大家讨论。

发布了16 篇原创文章 · 获赞 19 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/pengguichu/article/details/52135366
今日推荐