城市选择的三级联动

先看两张效果图:

效果图-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;

}

});

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,798评论 19 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,851评论 0 17
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,198评论 18 399
  • ¥开启¥ 【使用jni实现Tost】 〖2017-08-20 22:15:04〗 《在xx.cpp中写入以下代码€...
    小菜c阅读 4,353评论 0 1
  • 291天。时间遗忘在了风中,流失在了雨中,丢弃在了荒漠中,而我也随着时间一起,走过的痕迹变成了曾经。就如同沙滩上曾...
    黑兔子Gary阅读 1,573评论 0 0