开发中仿IOS三级菜单,开源项目PickView实用自定义数据封装使用实例
来源:互联网 发布:软件开发团队组成 编辑:程序博客网 时间:2024/06/06 19:53
compile 'com.contrarywind:Android-PickerView:3.2.7' androidStudio依赖,Eclipse可自行在github上搜索Android-PickerView项目添加依赖现git地址https://github.com/Bigkoo/Android-PickerView下面给出项目中自定义数据的联动菜单实现
二级菜单封装public class LocationPickerShowerLocal { Context context; private ArrayList<String> options1Items = new ArrayList<>(); private ArrayList<ArrayList<String>> options2Items = new ArrayList<>(); static TextView tv; LocalAreaBean localAreaBean; OnLocalOptionsSelectListener mListener; public LocationPickerShowerLocal( Context context, String data,OnLocalOptionsSelectListener mListener) { this.mListener = mListener; this.context = context; initJsonData(data); } public interface OnLocalOptionsSelectListener { void getLocalAreaCode(String text, String areaCode); } public void show() { showPickerView(); } private void showPickerView() { int color = context.getResources().getColor(R.color.maincolor); OptionsPickerView pvOptions = new OptionsPickerView.Builder(context, new OptionsPickerView.OnOptionsSelectListener() { @Override public void onOptionsSelect(int options1, int options2, int options3, View v) { //返回的分别是三个级别的选中位置 String text = options1Items.get(options1) + options2Items.get(options1).get(options2); mListener.getLocalAreaCode(text,localAreaBean.getData().get(options1).getTOWN().get(options2).getAREA_CODE()); } }).setTitleText("") .setDividerColor(color) .setTextColorCenter(color) .setContentTextSize(21) .setCancelColor(color) .setSubmitColor(color) .setSubmitText("完成") .setOutSideCancelable(true) .build(); pvOptions.setPicker(options1Items, options2Items);//二级选择器*/ pvOptions.show(); } private void initJsonData(String data) { //解析数据 /** * 添加省份数据 * * 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口, * PickerView会通过getPickerViewText方法获取字符串显示出来。 */ Gson gson = new Gson(); localAreaBean = gson.fromJson(data, LocalAreaBean.class); ArrayList<LocalAreaBean.DataBean> dataBean = (ArrayList<LocalAreaBean.DataBean>)localAreaBean.getData();// options1Items = dataBean; for (int i = 0; i < dataBean.size(); i++) {//遍历省份 options1Items.add(dataBean.get(i).getAREA_NAME()); ArrayList<String> CityList = new ArrayList<>();//该省的城市列表(第二级) for (int c = 0; c < dataBean.get(i).getTOWN().size(); c++) {//遍历该省份的所有城市 String CityName = dataBean.get(i).getTOWN().get(c).getAREA_NAME(); CityList.add(CityName);//添加城市 } /** * 添加城市数据 */ options2Items.add(CityList); } }}三级菜单封装public class LocationPickerShowerState { Context context; private ArrayList<String> options1Items = new ArrayList<>(); private ArrayList<ArrayList<String>> options2Items = new ArrayList<>(); private ArrayList<ArrayList<ArrayList<String>>> options3Items = new ArrayList<>(); OnOptionsSelectListener mListener; public LocationPickerShowerState(Context context, String data, OnOptionsSelectListener mListener) { this.mListener = mListener; this.context = context; initJsonData(data); } public void show() { showPickerView(); } public interface OnOptionsSelectListener { void getAreaCode(String text, String areaCode); } String areaCode = ""; private void showPickerView() { int color = context.getResources().getColor(R.color.maincolor); OptionsPickerView pvOptions = new OptionsPickerView.Builder(context, new OptionsPickerView.OnOptionsSelectListener() { @Override public void onOptionsSelect(int options1, int options2, int options3, View v) { //返回的分别是三个级别的选中位置 String text = options1Items.get(options1) + options2Items.get(options1).get(options2) + options3Items.get(options1).get(options2).get(options3); mListener.getAreaCode(text, stateAreaBean.getData().get(options1).getCITY().get(options2).getCOUNTY().get(options3).getAREA_CODE()); } }).setTitleText("") .setDividerColor(color) .setTextColorCenter(color) .setContentTextSize(21) .setCancelColor(color) .setSubmitColor(color) .setSubmitText("完成") .setOutSideCancelable(true) .build(); /*pvOptions.setPicker(options1Items);//一级选择器 pvOptions.setPicker(options1Items, options2Items);//二级选择器*/ pvOptions.setPicker(options1Items, options2Items, options3Items);//三级选择器 pvOptions.show(); } StateAreaBean stateAreaBean; private void initJsonData(String data) { //解析数据 /** * 添加省份数据 * * 注意:如果是添加的JavaBean实体,则实体类需要实现 IPickerViewData 接口, * PickerView会通过getPickerViewText方法获取字符串显示出来。 */ Gson gson = new Gson(); stateAreaBean = gson.fromJson(data, StateAreaBean.class); ArrayList<StateAreaBean.DataBean> dataBean = (ArrayList<StateAreaBean.DataBean>) stateAreaBean.getData();// options1Items = dataBean; for (int i = 0; i < dataBean.size(); i++) {//遍历省份 options1Items.add(dataBean.get(i).getAREA_NAME()); ArrayList<String> CityList = new ArrayList<>();//该省的城市列表(第二级) ArrayList<ArrayList<String>> Province_AreaList = new ArrayList<>();//该省的所有地区列表(第三极) for (int c = 0; c < dataBean.get(i).getCITY().size(); c++) {//遍历该省份的所有城市 String CityName = dataBean.get(i).getCITY().get(c).getAREA_NAME(); CityList.add(CityName);//添加城市 ArrayList<String> City_AreaList = new ArrayList<>();//该城市的所有地区列表 //如果无地区数据,建议添加空字符串,防止数据为null 导致三个选项长度不匹配造成崩溃 if (dataBean.get(i).getCITY().get(c).getAREA_NAME() == null || dataBean.get(i).getCITY().get(c).getCOUNTY().size() == 0) { City_AreaList.add(""); } else { for (int d = 0; d < dataBean.get(i).getCITY().get(c).getCOUNTY().size(); d++) {//该城市对应地区所有数据 String AreaName = dataBean.get(i).getCITY().get(c).getCOUNTY().get(d).getAREA_NAME(); City_AreaList.add(AreaName);//添加该城市所有地区数据 } } Province_AreaList.add(City_AreaList);//添加该省所有地区数据 } /** * 添加城市数据 */ options2Items.add(CityList); /** * 添加地区数据 */ options3Items.add(Province_AreaList); } }}三级时间菜单封装public class BirthdayPickerShower { private TimePickerView pvTime; TextView tv; Context context; public BirthdayPickerShower(TextView textView, Context context) { tv = textView; this.context = context; initTimePicker(); } public void show() { pvTime.show(tv); } private void initTimePicker() { //控制时间范围(如果不设置范围,则使用默认时间1900-2100年,此段代码可注释) //因为系统Calendar的月份是从0-11的,所以如果是调用Calendar的set方法来设置时间,月份的范围也要是从0-11 Calendar selectedDate = Calendar.getInstance(); Calendar startDate = Calendar.getInstance(); startDate.set(1917, 0, 23); Calendar endDate = Calendar.getInstance(); endDate.set(2018, 11, 28); int color = context.getResources().getColor(R.color.maincolor); //时间选择器 pvTime = new TimePickerView.Builder(context, new TimePickerView.OnTimeSelectListener() { @Override public void onTimeSelect(Date date, View v) {//选中事件回调 // 这里回调过来的v,就是show()方法里面所添加的 View 参数,如果show的时候没有添加参数,v则为null TextView view = (TextView) v; view.setText(getTime(date)); } }) //年月日时分秒 的显示与否,不设置则默认全部显示 .setType(new boolean[]{true, true, true, false, false, false}) .setLabel("", "", "", "", "", "") .isCenterLabel(false) .setDividerColor(color) .setTextColorCenter(color) .setCancelColor(color) .setSubmitColor(color) .setSubmitText("完成") .setContentSize(21) .setDate(selectedDate) .setRangDate(startDate, endDate) .setDecorView(null) .build(); } private String getTime(Date date) {//可根据需要自行截取数据显示 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); return format.format(date); }}实体bean,如果不需要标题不需要实现IPickerViewData ,我这里也没好好实现 因为发现我的效果不需要标题public class LocalAreaBean implements IPickerViewData { // 实现 IPickerViewData 接口, // 这个用来显示在PickerView上面的字符串, // PickerView会通过IPickerViewData获取getPickerViewText方法显示出来。 @Override public String getPickerViewText() { return this.name; } public String getName() { return name; } public void setName(String name) { this.name = name; } /** * resCode : 000 * resMsg : 请求成功!~ * data : [{"AREA_NAME":"巴州镇","TOWN":[{"AREA_CODE":"632122001001","AREA_NAME":"巴州二村村委会"},{"AREA_CODE":"632122001002","AREA_NAME":"巴州一村村委会"},{"AREA_CODE":"632122001004","AREA_NAME":"大焦土村村委会"},{"AREA_CODE":"632122001003","AREA_NAME":"巴州垣村村委会"},{"AREA_CODE":"632122001010","AREA_NAME":"祁家村村委会"},{"AREA_CODE":"632122001018","AREA_NAME":"阳山村村委会"}]}] */ private String name; private String resCode; private String resMsg; private List<DataBean> data; public String getResCode() { return resCode; } public void setResCode(String resCode) { this.resCode = resCode; } public String getResMsg() { return resMsg; } public void setResMsg(String resMsg) { this.resMsg = resMsg; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * AREA_NAME : 巴州镇 * TOWN : [{"AREA_CODE":"632122001001","AREA_NAME":"巴州二村村委会"},{"AREA_CODE":"632122001002","AREA_NAME":"巴州一村村委会"},{"AREA_CODE":"632122001004","AREA_NAME":"大焦土村村委会"},{"AREA_CODE":"632122001003","AREA_NAME":"巴州垣村村委会"},{"AREA_CODE":"632122001010","AREA_NAME":"祁家村村委会"},{"AREA_CODE":"632122001018","AREA_NAME":"阳山村村委会"}] */ private String AREA_NAME; private List<TOWNBean> TOWN; public String getAREA_NAME() { return AREA_NAME; } public void setAREA_NAME(String AREA_NAME) { this.AREA_NAME = AREA_NAME; } public List<TOWNBean> getTOWN() { return TOWN; } public void setTOWN(List<TOWNBean> TOWN) { this.TOWN = TOWN; } public static class TOWNBean { /** * AREA_CODE : 632122001001 * AREA_NAME : 巴州二村村委会 */ private String AREA_CODE; private String AREA_NAME; public String getAREA_CODE() { return AREA_CODE; } public void setAREA_CODE(String AREA_CODE) { this.AREA_CODE = AREA_CODE; } public String getAREA_NAME() { return AREA_NAME; } public void setAREA_NAME(String AREA_NAME) { this.AREA_NAME = AREA_NAME; } } }}使用public class StateAreaBean { /** * resCode : 000 * resMsg : 请求成功!~ * data : [{"CITY":[{"AREA_NAME":"海东市","AREA_CODE":"632100000000","COUNTY":[{"AREA_CODE":"632122000000","AREA_NAME":"民和回族土族自治县"},{"AREA_CODE":"632121000000","AREA_NAME":"平安区"},{"AREA_CODE":"632128000000","AREA_NAME":"循化撒拉族自治县"},{"AREA_CODE":"632127000000","AREA_NAME":"化隆回族自治县"},{"AREA_CODE":"632126000000","AREA_NAME":"互助土族自治县"},{"AREA_CODE":"632123000000","AREA_NAME":"乐都区"}]}],"AREA_NAME":"青海省","AREA_CODE":"630000000000"}] */ private String resCode; private String resMsg; private List<DataBean> data; public String getResCode() { return resCode; } public void setResCode(String resCode) { this.resCode = resCode; } public String getResMsg() { return resMsg; } public void setResMsg(String resMsg) { this.resMsg = resMsg; } public List<DataBean> getData() { return data; } public void setData(List<DataBean> data) { this.data = data; } public static class DataBean { /** * CITY : [{"AREA_NAME":"海东市","AREA_CODE":"632100000000","COUNTY":[{"AREA_CODE":"632122000000","AREA_NAME":"民和回族土族自治县"},{"AREA_CODE":"632121000000","AREA_NAME":"平安区"},{"AREA_CODE":"632128000000","AREA_NAME":"循化撒拉族自治县"},{"AREA_CODE":"632127000000","AREA_NAME":"化隆回族自治县"},{"AREA_CODE":"632126000000","AREA_NAME":"互助土族自治县"},{"AREA_CODE":"632123000000","AREA_NAME":"乐都区"}]}] * AREA_NAME : 青海省 * AREA_CODE : 630000000000 */ private String AREA_NAME; private String AREA_CODE; private List<CITYBean> CITY; public String getAREA_NAME() { return AREA_NAME; } public void setAREA_NAME(String AREA_NAME) { this.AREA_NAME = AREA_NAME; } public String getAREA_CODE() { return AREA_CODE; } public void setAREA_CODE(String AREA_CODE) { this.AREA_CODE = AREA_CODE; } public List<CITYBean> getCITY() { return CITY; } public void setCITY(List<CITYBean> CITY) { this.CITY = CITY; } public static class CITYBean { /** * AREA_NAME : 海东市 * AREA_CODE : 632100000000 * COUNTY : [{"AREA_CODE":"632122000000","AREA_NAME":"民和回族土族自治县"},{"AREA_CODE":"632121000000","AREA_NAME":"平安区"},{"AREA_CODE":"632128000000","AREA_NAME":"循化撒拉族自治县"},{"AREA_CODE":"632127000000","AREA_NAME":"化隆回族自治县"},{"AREA_CODE":"632126000000","AREA_NAME":"互助土族自治县"},{"AREA_CODE":"632123000000","AREA_NAME":"乐都区"}] */ private String AREA_NAME; private String AREA_CODE; private List<COUNTYBean> COUNTY; public String getAREA_NAME() { return AREA_NAME; } public void setAREA_NAME(String AREA_NAME) { this.AREA_NAME = AREA_NAME; } public String getAREA_CODE() { return AREA_CODE; } public void setAREA_CODE(String AREA_CODE) { this.AREA_CODE = AREA_CODE; } public List<COUNTYBean> getCOUNTY() { return COUNTY; } public void setCOUNTY(List<COUNTYBean> COUNTY) { this.COUNTY = COUNTY; } public static class COUNTYBean { /** * AREA_CODE : 632122000000 * AREA_NAME : 民和回族土族自治县 */ private String AREA_CODE; private String AREA_NAME; public String getAREA_CODE() { return AREA_CODE; } public void setAREA_CODE(String AREA_CODE) { this.AREA_CODE = AREA_CODE; } public String getAREA_NAME() { return AREA_NAME; } public void setAREA_NAME(String AREA_NAME) { this.AREA_NAME = AREA_NAME; } } } }}
1.实现接口public class VerificationIdentityActivity extends BaseActivity implements LocationPickerShowerState.OnOptionsSelectListener, LocationPickerShowerLocal.OnLocalOptionsSelectListener@Overridepublic void getAreaCode(String text, String areaCode) { countryText = text; liveDistrictTv.setText(countryText); countyCode = areaCode;}/** * 现居村社选择完成回调方法 */@Overridepublic void getLocalAreaCode(String text, String areaCode) { localText = text; liveVillageTv.setText(localText); localCode = areaCode;}
2.显示LocationPickerShowerState locationPickerShowerState;LocationPickerShowerLocal locationPickerShowerLocal;Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { switch (msg.what) { case STATE: locationPickerShowerState.show(); break; case Local: locationPickerShowerLocal.show(); break; } return false; }});
阅读全文
0 0
- 开发中仿IOS三级菜单,开源项目PickView实用自定义数据封装使用实例
- iOS自定义的PickView
- iOS 怎么封装一个三级下拉菜单?
- Android 高仿IOS的省、市、区三级联动效果(含数据,可直接用到项目中)
- IOS初学:使用PickView中遇到的问题
- IOS 学习 PickView的使用
- Android中PIckView的使用
- 仿QQ菜单----三级菜单
- PickView实现三级联动
- iOS开发--PickView 选取器笔记
- iOS开发总结之项目开发中使用UITableView自定义多级表格&自定义cell
- ios开发中经典应用高仿项目分享<一>
- ios开发中经典应用高仿项目分享<二>
- IOS开发之三级控制器的使用与自定义标签工具栏
- iOS开发之优秀的开源项目之-高仿bilibili项目
- iOS项目开发实例
- swift 弹出pickview实例
- python编程实例-三级菜单
- Linux 常用命令
- RockChip MPP
- 有关compileSdkVersion、targetSdkVersion的笔记
- python MySQLdb Could not to connect MySQL server
- C++中指针初始化和使用注意事项
- 开发中仿IOS三级菜单,开源项目PickView实用自定义数据封装使用实例
- Session Fixation
- 解决Orcale in超过1000个时出现“”列表中的最大表达式数为 1000”这个异常的问题
- gdb——基本指令
- struts学习总结
- PHP 抽象类的简单测试与总结
- WinCE 下 RAS 拨号连接的建立和拨号过程
- Maven有关于scope的解释
- delphi 主从表参数定义不正常错误的解决