100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > android 省市区三级联动选择器

android 省市区三级联动选择器

时间:2019-01-05 20:20:16

相关推荐

android 省市区三级联动选择器

本文是点面具全(啰里八嗦)的纯码篇。

通过读取本地json文件显示数据,使用gson解析。

gradle中添加

//gson

compile ‘com.google.code.gson:gson:2.1’

//滚动选择器

compile ‘com.contrarywind:Android-PickerView:4.1.3’

AddressPickerDialog.java

public class AddressPickerDialog extends Dialog implements View.OnClickListener {private WheelView wvProvince, wvCity, wvArea;//弹出框的标题private String title;private Context mContext;private List<RegionProvinceBean> provinceBeans = null;AddressPickerDialog(Context context, String title, AddressPickerDialog.onAreaPickerDialogClickListener listener) {// 在构造方法里, 传入主题super(context, R.style.BottomDialogStyle);mContext = context;// 拿到Dialog的Window, 修改Window的属性Window window = getWindow();assert window != null;window.getDecorView().setPadding(0, 0, 0, 0);//获取当前屏幕的宽高DisplayMetrics dm = mContext.getResources().getDisplayMetrics();// 获取Window的LayoutParamsWindowManager.LayoutParams attributes = window.getAttributes();attributes.width = WindowManager.LayoutParams.MATCH_PARENT;attributes.height = dm.heightPixels / 3;//默认显示高度为屏幕的三分之一attributes.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;attributes.dimAmount = 0.3f;// 一定要重新设置, 才能生效window.setAttributes(attributes);window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);this.title = title;this.listener = listener;}@SuppressLint("HandlerLeak")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.dialog_wheelview_address);initView();initData();}private void initView() {TextView tvAddressTitle = findViewById(R.id.tv_addresspicker_title);wvProvince = findViewById(R.id.wheelv_province);wvCity = findViewById(R.id.wheelv_city);wvArea = findViewById(R.id.wheelv_area);findViewById(R.id.tv_addresspicker_confirm).setOnClickListener(this);findViewById(R.id.tv_addresspicker_exit).setOnClickListener(this);if (!TextUtils.isEmpty(title)) tvAddressTitle.setText(title);}private RegionProvinceBean curPBean;private RegionCityBean curCBean;private RegionAreaBean curABean;private void initData() {String regionStr = getLocalJson();Gson gson = new Gson();RegionBean regionBean = gson.fromJson(regionStr, RegionBean.class);if (regionBean == null) {return;}provinceBeans = regionBean.getData();curPBean = provinceBeans.get(0);wvProvince.setCyclic(false);wvCity.setCyclic(false);wvArea.setCyclic(false);ArrayList<String> pList = new ArrayList<>();final ArrayList<String> cList = new ArrayList<>();final ArrayList<String> aList = new ArrayList<>();curPBean = provinceBeans.get(0);for (RegionProvinceBean p : provinceBeans) {pList.add(p.getAreaname());}wvProvince.setAdapter(new ArrayWheelAdapter<>(pList));wvProvince.setCurrentItem(0);curCBean = curPBean.getSubarea().get(0);for (RegionCityBean c : curPBean.getSubarea()) {cList.add(c.getAreaname());}wvCity.setAdapter(new ArrayWheelAdapter<>(cList));wvCity.setCurrentItem(0);curABean = curCBean.getSubarea().get(0);for (RegionAreaBean a : curCBean.getSubarea()) {aList.add(a.getAreaname());}wvArea.setAdapter(new ArrayWheelAdapter<>(aList));wvArea.setCurrentItem(0);wvProvince.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(int index) {curPBean = provinceBeans.get(index);//联动第二级cList.clear();ArrayList<RegionCityBean> cBeans = curPBean.getSubarea();curCBean = cBeans.get(0);for (RegionCityBean c : cBeans) {cList.add(c.getAreaname());}wvCity.setAdapter(new ArrayWheelAdapter<>(cList));wvCity.setCurrentItem(0);//联动第三级aList.clear();ArrayList<RegionAreaBean> aBeans = curCBean.getSubarea();curABean = aBeans.get(0);for (RegionAreaBean a : aBeans) {aList.add(a.getAreaname());}wvArea.setAdapter(new ArrayWheelAdapter<>(aList));wvArea.setCurrentItem(0);}});wvCity.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(int index) {curCBean = curPBean.getSubarea().get(index);//联动第三级aList.clear();ArrayList<RegionAreaBean> aBeans = curCBean.getSubarea();curABean = aBeans.get(0);for (RegionAreaBean a : aBeans) {aList.add(a.getAreaname());}wvArea.setAdapter(new ArrayWheelAdapter<>(aList));wvArea.setCurrentItem(0);}});wvArea.setOnItemSelectedListener(new OnItemSelectedListener() {@Overridepublic void onItemSelected(int index) {curABean = curCBean.getSubarea().get(index);}});}@Overridepublic void onClick(View v) {RegionChoosedBean bean = new RegionChoosedBean();switch (v.getId()) {case R.id.tv_addresspicker_confirm:bean.setEmpty(false);bean.setpCode(curPBean.getAreacode());bean.setpName(curPBean.getAreaname());bean.setcCode(curCBean.getAreacode());bean.setcName(curCBean.getAreaname());bean.setaCode(curABean.getAreacode());bean.setaName(curABean.getAreaname());listener.onChooseClick(bean);break;case R.id.tv_addresspicker_exit:bean.setEmpty(true);listener.onChooseClick(bean);break;}}private AddressPickerDialog.onAreaPickerDialogClickListener listener;public interface onAreaPickerDialogClickListener {void onChooseClick(RegionChoosedBean bean);}/*** 获取本地json文件** @return 本地json内容的字符串*/private String getLocalJson() {StringBuilder builder = new StringBuilder();try {AssetManager assetManager = mContext.getAssets(); // 获得assets资源管理器(assets中的文件无法直接访问,可以使用AssetManager访问)InputStreamReader inputStreamReader = new InputStreamReader(assetManager.open("region.json"), "UTF-8");BufferedReader br = new BufferedReader(inputStreamReader);String line;while ((line = br.readLine()) != null) {builder.append(line);}br.close();inputStreamReader.close();} catch (IOException e) {e.printStackTrace();}return builder.toString();}}

dialog_wheelview_address.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayout android:layout_width="match_parent"android:layout_height="60dp"android:background="#c0eeea"android:gravity="center_vertical"android:orientation="horizontal"android:padding="20dp"><TextView android:id="@+id/tv_addresspicker_exit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="取消"android:textColor="#287a72" /><TextView android:id="@+id/tv_addresspicker_title"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:gravity="center"android:text="选择地区"android:textColor="#222" /><TextView android:id="@+id/tv_addresspicker_confirm"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="完成"android:textColor="#287a72" /></LinearLayout><LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="horizontal"><com.contrarywind.view.WheelView android:id="@+id/wheelv_province"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><com.contrarywind.view.WheelView android:id="@+id/wheelv_city"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><com.contrarywind.view.WheelView android:id="@+id/wheelv_area"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout></LinearLayout>

Activity调用

private AddressPickerDialog dialog = null;@OnClick(R.id.tv_choose_address)public void onViewClick(View v) {dialog = new AddressPickerDialog(mContext,"弹出框标题", new AddressPickerDialog.onAreaPickerDialogClickListener() {@Overridepublic void onChooseClick(RegionChoosedBean bean) {//bean 为点击完成返回的数据对象if (bean.isEmpty()) {tvAddress.setText("未选择数据");} else {tvAddress.setText(bean.getpName() + "\t" + bean.getcName() + "\t" + bean.getaName());}dialog.cancel();}});dialog.show();}

json字符串对应的实体类

public class RegionBean {

private ArrayList data;

public ArrayList getData() {

return data;

}

public void setData(ArrayList data) {

this.data = data;

}

}

实体类

//省

public class RegionProvinceBean {

private String areacode;

private String areaname;

private ArrayList subarea;

public String getAreacode() {

return areacode;

}

public void setAreacode(String areacode) {

this.areacode = areacode;

}

public String getAreaname() {

return areaname;

}

public void setAreaname(String areaname) {

this.areaname = areaname;

}

public ArrayList getSubarea() {

return subarea;

}

public void setSubarea(ArrayList subarea) {

this.subarea = subarea;

}

}

//市

public class RegionCityBean {

private String areacode;

private String areaname;

private ArrayList subarea;

public String getAreacode() {

return areacode;

}

public void setAreacode(String areacode) {

this.areacode = areacode;

}

public String getAreaname() {

return areaname;

}

public void setAreaname(String areaname) {

this.areaname = areaname;

}

public ArrayList getSubarea() {

return subarea;

}

public void setSubarea(ArrayList subarea) {

this.subarea = subarea;

}

}

//区

public class RegionAreaBean {

private String areacode;

private String areaname;

public String getAreacode() {

return areacode;

}

public void setAreacode(String areacode) {

this.areacode = areacode;

}

public String getAreaname() {

return areaname;

}

public void setAreaname(String areaname) {

this.areaname = areaname;

}

}

省市区json数据下载:/download/qq_28026283/10500611

本文参考:/Bigkoo/Android-PickerView

参考文章作者已经封装了数据类型为集合的省市区三级联动,个人习惯了实体类去处理,所以还是自己借用WheelView写了[比心][比心][比心]

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。