美文网首页
城市选择的三级联动

城市选择的三级联动

作者: imperial_南桥 | 来源:发表于2017-11-25 16:21 被阅读0次

先看两张效果图:

效果图-1 效果图-2

省市县这些玩意儿一般不会变的,所以借力竭力说服了领导,将地址的json文件放在本地,不用每次都请求,json结构是这样的:

json结构

用到的三方库:

compile 'com.github.open-android:WheelPicker:v1.0.0'

自定义PopWindow

public class AddPopWindow extends PopupWindow {

private View conentView;

protected Contextm Context;

/**

*初始化一个PopupWindow

*

*@paramcontext上下文对象

*@paramresId自定义的布局文件

*/

publi cAddPopWindow(final Activity context, intresId) {

mContext= context;

/**

*加载自定义布局

*/

//初始化布局加载器

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

conentView= inflater.inflate(resId, null);

DisplayMetrics metrics =newDisplayMetrics();

WindowManager manager = context.getWindowManager();

manager.getDefaultDisplay().getMetrics(metrics);

//获取屏幕的宽和高

inth = metrics.heightPixels- com.lzp.statusbar.utils.SystemUtils.getStatusHeight(context);

intw = metrics.widthPixels;

//设置SelectPicPopupWindow的View

this.setContentView(conentView);

//设置SelectPicPopupWindow弹出窗体的宽

this.setWidth(w);

//设置SelectPicPopupWindow弹出窗体的高

//this.setHeight(h);

this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);

//设置SelectPicPopupWindow弹出窗体可点击

this.setFocusable(true);

this.setOutsideTouchable(true);

//软盘弹出时,显示的效果

setSoftInputMode(PopupWindow.INPUT_METHOD_NEEDED);

setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

//刷新状态

this.update();

//实例化一个ColorDrawable颜色为透明

ColorDrawable dw =newColorDrawable(0x00000000);

//点back键和其他地方使其消失,设置了这个才能触发OnDismisslistener,设置其他控件变化等操作

this.setBackgroundDrawable(dw);

setAnimationStyle(R.style.PopWindow_y_anim_style);

//this.setAnimationStyle(android.R.style.Animation_Translucent);

//设置SelectPicPopupWindow弹出窗体动画效果

//this.setAnimationStyle(R.style.AnimationPreview);

}

/**

*获取自定义到PopupWindow中的布局

*

*@return

*/

publicViewgetWindowRootView() {

returnconentView;

}

/**

*显示popupWindow

*必须调用这个方法才能显示出来PopupWindow

*/

public voidshowPopupWindow(View parent) {

if(!this.isShowing()) {

//以下拉方式显示popupwindow

this.showAtLocation(parent,Gravity.BOTTOM,0,0);

}else{

this.dismiss();

}

}

/**

*关闭PopupWindow

*/

public voidclosePopupWindow() {

if(isShowing())

dismiss();

}

}

地址选择的PopupWindow:

public classAddressSelectPopWindowextendsAddPopWindow {

privateWheelCurvedPickermWheelProvince;

privateWheelCurvedPickermWheelCity;

privateWheelCurvedPickermWheelCounty;

privateImageViewmIvClose;

privateTextViewmTvConfig;

privateListmAddressData;

privateListmProvinceData;

privateListmCityData;

privateListmCountryData;

privateWheelChangeListenermChangeListener;

private intmProvincePosition;

private intmCityPosition;

private intmCountryPosition;

/**

*初始化一个PopupWindow

*

*@paramcontext上下文对象

*/

publicAddressSelectPopWindow(Activity context) {

super(context,R.layout.layout_pop_select_address);

SelectAddressPopBinding binding = SelectAddressPopBinding.bind(getWindowRootView());

mWheelProvince= binding.wheelProvince;

mWheelCity= binding.wheelCity;

mWheelCounty=binding.wheelCounty;

mIvClose= binding.ivClose;

mTvConfig= binding.tvConfig;

initData(context);

init();

}

private voidinitData(Context context) {

try{

mAddressData= JsonFormFileUtils.getJsonArray(context,"address.json",AddressBean.class);

}catch(IOException e) {

e.printStackTrace();

}

}

public voidsetWheelChangeListener(WheelChangeListener listener) {

mChangeListener= listener;

}

private voidinit() {

/*设置显示字体的小*/

mWheelProvince.setTextSize(18);

mWheelCity.setTextSize(18);

mWheelCounty.setTextSize(18);

mWheelProvince.setMinimumHeight(40);

mWheelCity.setMinimumHeight(40);

mWheelCounty.setMinimumHeight(40);

mWheelProvince.setItemCount(10);

mWheelCity.setItemCount(10);

mWheelCounty.setItemCount(10);

mProvinceData= getAddressProvinceList(mAddressData);

mWheelProvince.setData(mProvinceData);

mWheelProvince.setOnWheelChangeListener(newSimpleWheelChangeListener() {

@Override

public voidonWheelSelected(intindex,String data) {

mProvincePosition= index;

mCityData= getAddressCityList(mAddressData,mProvincePosition);

mWheelCity.setData(mCityData);

mWheelCity.setItemIndex(0);

mCityPosition=0;

mCountryData=getAddressCountry(mAddressData.get(mProvincePosition).getSub(),mCityPosition);

mWheelCounty.setData(mCountryData);

mWheelCounty.setItemIndex(0);

mCountryPosition=0;

}

});

mWheelCity.setOnWheelChangeListener(newSimpleWheelChangeListener() {

@Override

public voidonWheelSelected(intindex,String data) {

mCityPosition= index;

mCountryData=getAddressCountry(mAddressData.get(mProvincePosition).getSub(),mCityPosition);

mWheelCounty.setData(mCountryData);

mWheelCounty.setItemIndex(0);

mCountryPosition=0;

}

});

mWheelCounty.setOnWheelChangeListener(newSimpleWheelChangeListener(){

@Override

public voidonWheelSelected(intindex,String data) {

mCountryPosition=index;

}

});

mIvClose.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View v) {

dismiss();

}

});

mTvConfig.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View v) {

dismiss();

if(mChangeListener!=null) {

String provinceNo =mAddressData.get(mProvincePosition).getId();

String cityNo =mAddressData.get(mProvincePosition).getSub().get(mCityPosition).getId();

String countyNo=mAddressData.get(mProvincePosition).getSub().get(mCityPosition).getSub2().get(mCountryPosition).getId();

mChangeListener.onWheelSelected(provinceNo,cityNo,countyNo,mProvinceData.get(mProvincePosition)

,mCityData.get(mCityPosition),mCountryData.get(mCountryPosition));

}

}

});

}

public voidaddressReset() {

mWheelProvince.setItemIndex(0);

mProvincePosition=0;

mCityData= getAddressCityList(mAddressData,mProvincePosition);

mWheelCity.setData(mCityData);

mCityPosition=0;

mWheelCity.setItemIndex(0);

mCountryData=getAddressCountry(mAddressData.get(mProvincePosition).getSub(),mCityPosition);

mWheelCounty.setData(mCountryData);

mCountryPosition=0;

mWheelCounty.setItemIndex(0);

}

privateListgetAddressProvinceList(List addressList) {

List provinceList =newArrayList<>();

for(AddressBean addressLinkageBean : addressList) {

provinceList.add(addressLinkageBean.getName());

}

returnprovinceList;

}

privateListgetAddressCityList(List addressList, intprovincePosition) {

List cityList =newArrayList<>();

List cityBeanList = addressList.get(provincePosition).getSub();

for(AddressBean.SubBean cityBean : cityBeanList) {

cityList.add(cityBean.getName());

}

returncityList;

}

privateListgetAddressCountry(List addressList,intcityPosition){

List countryList =newArrayList<>();

List cubBeen = addressList.get(cityPosition).getSub2();

for(AddressBean.SubBean.Sub2Bean cityBean : cubBeen) {

countryList.add(cityBean.getName());

}

returncountryList;

}

public interfaceWheelChangeListener {

/**

*@paramprovinceNo省id

*@paramcityNo市id

*@paramcountyNo县id

*@paramprovinceData省名称

*@paramcityData市名称

*@paramcountyData县名称

*/

voidonWheelSelected(String provinceNo,String cityNo,String countyNo

,String provinceData,String cityData,String countyData);

}

}

用法:

mPopWindow=newAddressSelectPopWindow(AddressActivity.this);

mDataBinding.common.setOnClickListener(newView.OnClickListener() {

@Override

public voidonClick(View v) {

mPopWindow.addressReset();

mPopWindow.showPopupWindow(mDataBinding.getRoot());

}

});

mPopWindow.setWheelChangeListener(newAddressSelectPopWindow.WheelChangeListener() {

@Override

public voidonWheelSelected(String provinceNo,String cityNo,String countyNo,String provinceData,String cityData,String countyData) {

mDataBinding.common.setText(provinceData + cityData+countyData);

address=provinceData + cityData+countyData;

mProvenceId=provinceNo;

mCityId=cityNo;

mCountryId=countyNo;

}

});

相关文章

  • citySelected 三级联动

    angularJs 城市三级联动,实现有值传入会默认选择值html 内容 js代码

  • jQuery 实现省市区三级联动

    引言 项目开发中,经常会遇到城市三级联动的需求,这里总结一下使用 jQuery 方式实现三级联动 首先,城市数据有...

  • Swift - 多级城市联动选择器

    多级城市联动选择器 - 可设置默认城市一级 省份二级 省份+城市三级 省份+城市+区 Demo使用例子 源码:ht...

  • 城市选择的三级联动

    先看两张效果图: 省市县这些玩意儿一般不会变的,所以借力竭力说服了领导,将地址的json文件放在本地,不用每次都请...

  • iOS 城市列表三级联动(不强制选择到区或者市)

    一:前言 有时项目会遇到城市选择的需求,但是客户又不想要强制选择到区,现在三级联动全都是强制选择到区,所以就自...

  • iOS 城市3级联动

    UIPickerView 实现城市选择三级联动。 需要用到一些宏定义 上代码 初始化话一个UIPickerView...

  • vue三级联动

    示例:选择省市区的三级联动 template: script: distList.js

  • 微信小程序三级联动之多列选择器

    有些时候,三级联动业务场景并不只是全国地区选择,可能还涉及到自定义分类的三级联动,这时就需要使用微信的多列选择器。...

  • ant-design-vue 配置每个层

    需求是有三级联动,任意点击哪个层级的选项都可以选择,而不是必须选择三级的某一项才行,一级二级只做联动。ant官网上...

  • 微信小程序(二)

    关于微信小程序三级联动之多列选择器的学习心得与摘抄有些时候,三级联动业务场景并不只是全国地区选择,可能还涉及到自定...

网友评论

      本文标题:城市选择的三级联动

      本文链接:https://www.haomeiwen.com/subject/dfdiuttx.html