您的位置:首页 > 移动开发 > Android开发

Android 地址选择器,实现省市区三级联动

2017-03-08 11:23 555 查看
最近项目里面用到了一个地址选择器,实现现在主流的WheelView滑动选择,整理了下,做了个Demo.废话不多说,直接上代码:

主布局:

[java] view
plain copy

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context="com.example.user.myapplication.MainActivity">

<TextView

android:id="@+id/select_address_tv"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:textSize="15sp"

android:text="选择地址" />

</RelativeLayout>

MainActivity:

[java] view
plain copy

package com.example.user.myapplication;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.Gravity;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

private TextView select_address_tv;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

select_address_tv= (TextView) findViewById(R.id.select_address_tv);

select_address_tv .setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

ChangeAddressPopwindow mChangeAddressPopwindow = new ChangeAddressPopwindow(MainActivity.this);

mChangeAddressPopwindow.setAddress("广东", "深圳", "福田区");

mChangeAddressPopwindow.showAtLocation(select_address_tv, Gravity.BOTTOM, 0, 0);

mChangeAddressPopwindow

.setAddresskListener(new ChangeAddressPopwindow.OnAddressCListener() {

@Override

public void onClick(String province, String city, String area) {

// TODO Auto-generated method stub

Toast.makeText(MainActivity.this,

province + "-" + city + "-" + area,

Toast.LENGTH_LONG).show();

select_address_tv.setText(province + city + area);

}

});

}

});

}

}

主要的类:

[java] view
plain copy

package com.example.user.myapplication;

import android.content.Context;

import android.graphics.drawable.ColorDrawable;

import android.view.View;

import android.view.ViewGroup;

import android.widget.PopupWindow;

import android.widget.TextView;

import com.example.user.myapplication.wheelview.OnWheelChangedListener;

import com.example.user.myapplication.wheelview.OnWheelScrollListener;

import com.example.user.myapplication.wheelview.WheelView;

import com.example.user.myapplication.wheelview.adapter.AbstractWheelTextAdapter1;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

public class ChangeAddressPopwindow extends PopupWindow implements View.OnClickListener {

private WheelView wvProvince;

private WheelView wvCitys;

private WheelView wvArea;

private View lyChangeAddress;

private View lyChangeAddressChild;

private TextView btnSure;

private TextView btnCancel;

private Context context;

private JSONObject mJsonObj;

/**

* 所有省

*/

private String[] mProvinceDatas;

/**

* key - 省 value - 市s

*/

private Map<String, String[]> mCitisDatasMap = new HashMap<String, String[]>();

/**

* key - 市 values - 区s

*/

private Map<String, String[]> mAreaDatasMap = new HashMap<String, String[]>();

private ArrayList<String> arrProvinces = new ArrayList<String>();

private ArrayList<String> arrCitys = new ArrayList<String>();

private ArrayList<String> arrAreas = new ArrayList<String>();

private AddressTextAdapter provinceAdapter;

private AddressTextAdapter cityAdapter;

private AddressTextAdapter areaAdapter;

private String strProvince = "广东";

private String strCity = "深圳";

private String strArea = "福田区";

private OnAddressCListener onAddressCListener;

private int maxsize = 14;

private int minsize = 12;

public ChangeAddressPopwindow(final Context context) {

super(context);

this.context = context;

View view=View.inflate(context,R.layout.edit_changeaddress_pop_layout,null);

wvProvince = (WheelView) view.findViewById(R.id.wv_address_province);

wvCitys = (WheelView) view.findViewById(R.id.wv_address_city);

wvArea = (WheelView)view. findViewById(R.id.wv_address_area);

lyChangeAddress = view.findViewById(R.id.ly_myinfo_changeaddress);

lyChangeAddressChild = view.findViewById(R.id.ly_myinfo_changeaddress_child);

btnSure = (TextView) view.findViewById(R.id.btn_myinfo_sure);

btnCancel = (TextView)view. findViewById(R.id.btn_myinfo_cancel);

//设置SelectPicPopupWindow的View

this.setContentView(view);

//设置SelectPicPopupWindow弹出窗体的宽

this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);

//设置SelectPicPopupWindow弹出窗体的高

this.setHeight(ViewGroup.LayoutParams.MATCH_PARENT);

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

this.setFocusable(true);

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

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

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

ColorDrawable dw = new ColorDrawable(0xb0000000);

//设置SelectPicPopupWindow弹出窗体的背景

this.setBackgroundDrawable(dw);

lyChangeAddressChild.setOnClickListener(this);

btnSure.setOnClickListener(this);

btnCancel.setOnClickListener(this);

initJsonData();

initDatas();

initProvinces();

provinceAdapter = new AddressTextAdapter(context, arrProvinces, getProvinceItem(strProvince), maxsize, minsize);

wvProvince.setVisibleItems(5);

wvProvince.setViewAdapter(provinceAdapter);

wvProvince.setCurrentItem(getProvinceItem(strProvince));

initCitys(mCitisDatasMap.get(strProvince));

cityAdapter = new AddressTextAdapter(context, arrCitys, getCityItem(strCity), maxsize, minsize);

wvCitys.setVisibleItems(5);

wvCitys.setViewAdapter(cityAdapter);

wvCitys.setCurrentItem(getCityItem(strCity));

initAreas(mAreaDatasMap.get(strCity));

areaAdapter = new AddressTextAdapter(context, arrAreas, getAreaItem(strArea), maxsize, minsize);

wvArea.setVisibleItems(5);

wvArea.setViewAdapter(areaAdapter);

wvArea.setCurrentItem(getAreaItem(strArea));

wvProvince.addChangingListener(new OnWheelChangedListener() {

@Override

public void onChanged(WheelView wheel, int oldValue, int newValue) {

// TODO Auto-generated method stub

String currentText = (String) provinceAdapter.getItemText(wheel.getCurrentItem());

strProvince = currentText;

setTextviewSize(currentText, provinceAdapter);

String[] citys = mCitisDatasMap.get(currentText);

initCitys(citys);

cityAdapter = new AddressTextAdapter(context, arrCitys, 0, maxsize, minsize);

wvCitys.setVisibleItems(5);

wvCitys.setViewAdapter(cityAdapter);

wvCitys.setCurrentItem(0);

setTextviewSize("0", cityAdapter);

//根据市,地区联动

String[] areas = mAreaDatasMap.get(citys[0]);

initAreas(areas);

areaAdapter = new AddressTextAdapter(context, arrAreas, 0, maxsize, minsize);

wvArea.setVisibleItems(5);

wvArea.setViewAdapter(areaAdapter);

wvArea.setCurrentItem(0);

setTextviewSize("0", areaAdapter);

}

});

wvProvince.addScrollingListener(new OnWheelScrollListener() {

@Override

public void onScrollingStarted(WheelView wheel) {

// TODO Auto-generated method stub

}

@Override

public void onScrollingFinished(WheelView wheel) {

// TODO Auto-generated method stub

String currentText = (String) provinceAdapter.getItemText(wheel.getCurrentItem());

setTextviewSize(currentText, provinceAdapter);

}

});

wvCitys.addChangingListener(new OnWheelChangedListener() {

@Override

public void onChanged(WheelView wheel, int oldValue, int newValue) {

// TODO Auto-generated method stub

String currentText = (String) cityAdapter.getItemText(wheel.getCurrentItem());

strCity = currentText;

setTextviewSize(currentText, cityAdapter);

//根据市,地区联动

String[] areas = mAreaDatasMap.get(currentText);

initAreas(areas);

areaAdapter = new AddressTextAdapter(context, arrAreas, 0, maxsize, minsize);

wvArea.setVisibleItems(5);

wvArea.setViewAdapter(areaAdapter);

wvArea.setCurrentItem(0);

setTextviewSize("0", areaAdapter);

}

});

wvCitys.addScrollingListener(new OnWheelScrollListener() {

@Override

public void onScrollingStarted(WheelView wheel) {

// TODO Auto-generated method stub

}

@Override

public void onScrollingFinished(WheelView wheel) {

// TODO Auto-generated method stub

String currentText = (String) cityAdapter.getItemText(wheel.getCurrentItem());

setTextviewSize(currentText, cityAdapter);

}

});

wvArea.addChangingListener(new OnWheelChangedListener() {

@Override

public void onChanged(WheelView wheel, int oldValue, int newValue) {

// TODO Auto-generated method stub

String currentText = (String) areaAdapter.getItemText(wheel.getCurrentItem());

strArea = currentText;

setTextviewSize(currentText, cityAdapter);

}

});

wvArea.addScrollingListener(new OnWheelScrollListener() {

@Override

public void onScrollingStarted(WheelView wheel) {

// TODO Auto-generated method stub

}

@Override

public void onScrollingFinished(WheelView wheel) {

// TODO Auto-generated method stub

String currentText = (String) areaAdapter.getItemText(wheel.getCurrentItem());

setTextviewSize(currentText, areaAdapter);

}

});

}

private class AddressTextAdapter extends AbstractWheelTextAdapter1 {

ArrayList<String> list;

protected AddressTextAdapter(Context context, ArrayList<String> list, int currentItem, int maxsize, int minsize) {

super(context, R.layout.item_birth_year, NO_RESOURCE, currentItem, maxsize, minsize);

this.list = list;

setItemTextResource(R.id.tempValue);

}

@Override

public View getItem(int index, View cachedView, ViewGroup parent) {

View view = super.getItem(index, cachedView, parent);

return view;

}

@Override

public int getItemsCount() {

return list.size();

}

@Override

protected CharSequence getItemText(int index) {

return list.get(index) + "";

}

}

/**

* 设置字体大小

*

* @param curriteItemText

* @param adapter

*/

public void setTextviewSize(String curriteItemText, AddressTextAdapter adapter) {

ArrayList<View> arrayList = adapter.getTestViews();

int size = arrayList.size();

String currentText;

for (int i = 0; i < size; i++) {

TextView textvew = (TextView) arrayList.get(i);

currentText = textvew.getText().toString();

if (curriteItemText.equals(currentText)) {

textvew.setTextSize(14);

} else {

textvew.setTextSize(12);

}

}

}

public void setAddresskListener(OnAddressCListener onAddressCListener) {

this.onAddressCListener = onAddressCListener;

}

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

if (v == btnSure) {

if (onAddressCListener != null) {

onAddressCListener.onClick(strProvince, strCity,strArea);

}

} else if (v == btnCancel) {

} else if (v == lyChangeAddressChild) {

return;

} else {

// dismiss();

}

dismiss();

}

/**

* 回调接口

*

* @author Administrator

*

*/

public interface OnAddressCListener {

public void onClick(String province, String city, String area);

}

/**

* 从文件中读取地址数据

*/

private void initJsonData() {

try {

StringBuffer sb = new StringBuffer();

InputStream is = context.getClass().getClassLoader().getResourceAsStream("assets/" + "city.json");

int len = -1;

byte[] buf = new byte[1024];

while ((len = is.read(buf)) != -1) {

sb.append(new String(buf, 0, len, "gbk"));

}

is.close();

mJsonObj = new JSONObject(sb.toString());

} catch (IOException e) {

e.printStackTrace();

} catch (JSONException e) {

e.printStackTrace();

}

}

/**

* 解析整个Json对象,完成后释放Json对象的内存

*/

private void initDatas()

{

try

{

JSONArray jsonArray = mJsonObj.getJSONArray("citylist");

mProvinceDatas = new String[jsonArray.length()];

for (int i = 0; i < jsonArray.length(); i++)

{

JSONObject jsonP = jsonArray.getJSONObject(i);// 每个省的json对象

String province = jsonP.getString("p");// 省名字

mProvinceDatas[i] = province;

JSONArray jsonCs = null;

try

{

/**

* Throws JSONException if the mapping doesn't exist or is

* not a JSONArray.

*/

jsonCs = jsonP.getJSONArray("c");

} catch (Exception e1)

{

continue;

}

String[] mCitiesDatas = new String[jsonCs.length()];

for (int j = 0; j < jsonCs.length(); j++)

{

JSONObject jsonCity = jsonCs.getJSONObject(j);

String city = jsonCity.getString("n");// 市名字

mCitiesDatas[j] = city;

JSONArray jsonAreas = null;

try

{

/**

* Throws JSONException if the mapping doesn't exist or

* is not a JSONArray.

*/

jsonAreas = jsonCity.getJSONArray("a");

} catch (Exception e)

{

continue;

}

String[] mAreasDatas = new String[jsonAreas.length()];// 当前市的所有区

for (int k = 0; k < jsonAreas.length(); k++)

{

String area = jsonAreas.getJSONObject(k).getString("s");// 区域的名称

mAreasDatas[k] = area;

}

mAreaDatasMap.put(city, mAreasDatas);

}

mCitisDatasMap.put(province, mCitiesDatas);

}

} catch (JSONException e)

{

e.printStackTrace();

}

mJsonObj = null;

}

/**

* 初始化省会

*/

public void initProvinces() {

int length = mProvinceDatas.length;

for (int i = 0; i < length; i++) {

arrProvinces.add(mProvinceDatas[i]);

}

}

/**

* 根据省会,生成该省会的所有城市

*

* @param citys

*/

public void initCitys(String[] citys) {

if (citys != null) {

arrCitys.clear();

int length = citys.length;

for (int i = 0; i < length; i++) {

arrCitys.add(citys[i]);

}

} else {

String[] city = mCitisDatasMap.get("广东");

arrCitys.clear();

int length = city.length;

for (int i = 0; i < length; i++) {

arrCitys.add(city[i]);

}

}

if (arrCitys != null && arrCitys.size() > 0

&& !arrCitys.contains(strCity)) {

strCity = arrCitys.get(0);

}

}

/**

* 根据城市,生成该城市的所有地区

*

* @param areas

*/

public void initAreas(String[] areas) {

if (areas != null) {

arrAreas.clear();

int length = areas.length;

for (int i = 0; i < length; i++) {

arrAreas.add(areas[i]);

}

} else {

String[] area = mAreaDatasMap.get("深圳");

arrAreas.clear();

int length = area.length;

for (int i = 0; i < length; i++) {

arrAreas.add(area[i]);

}

}

if (arrAreas != null && arrAreas.size() > 0

&& !arrAreas.contains(strArea)) {

strArea = arrAreas.get(0);

}

}

/**

* 初始化地点

*

* @param province

* @param city

*/

public void setAddress(String province, String city, String area) {

if (province != null && province.length() > 0) {

this.strProvince = province;

}

if (city != null && city.length() > 0) {

this.strCity = city;

}

if (area != null && area.length() > 0) {

this.strArea = area;

}

}

/**

* 返回省会索引,没有就返回默认“广东”

*

* @param province

* @return

*/

public int getProvinceItem(String province) {

int size = arrProvinces.size();

int provinceIndex = 0;

boolean noprovince = true;

for (int i = 0; i < size; i++) {

if (province.equals(arrProvinces.get(i))) {

noprovince = false;

return provinceIndex;

} else {

provinceIndex++;

}

}

if (noprovince) {

strProvince = "广东";

return 18;

}

return provinceIndex;

}

/**

* 得到城市索引,没有返回默认“深圳”

*

* @param city

* @return

*/

public int getCityItem(String city) {

int size = arrCitys.size();

int cityIndex = 0;

boolean nocity = true;

for (int i = 0; i < size; i++) {

System.out.println(arrCitys.get(i));

if (city.equals(arrCitys.get(i))) {

nocity = false;

return cityIndex;

} else {

cityIndex++;

}

}

if (nocity) {

strCity = "深圳";

return 2;

}

return cityIndex;

}

/**

* 得到地区索引,没有返回默认“福田区”

*

* @param area

* @return

*/

public int getAreaItem(String area) {

int size = arrAreas.size();

int areaIndex = 0;

boolean noarea = true;

for (int i = 0; i < size; i++) {

System.out.println(arrAreas.get(i));

if (area.equals(arrAreas.get(i))) {

noarea = false;

return areaIndex;

} else {

areaIndex++;

}

}

if (noarea) {

strArea = "福田区";

return 1;

}

return areaIndex;

}

}

弹出框布局:

[java] view
plain copy

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/ly_myinfo_changeaddress"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#00000000"

android:gravity="bottom"

android:orientation="vertical" >

<LinearLayout

android:id="@+id/ly_myinfo_changeaddress_child"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:background="#ffffff"

android:orientation="vertical" >

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="44dp"

>

<TextView

android:id="@+id/btn_myinfo_cancel"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:paddingLeft="12dp"

android:text="取消"

android:gravity="center"

android:layout_alignParentLeft="true"

android:layout_marginRight="15dip"

android:textColor="#e84515"

android:textSize="13sp" />

<TextView

android:id="@+id/btn_myinfo_sure"

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:layout_alignParentRight="true"

android:gravity="center"

android:text="完成"

android:textColor="#e84515"

android:paddingRight="12dp"

android:textSize="12sp" />

</RelativeLayout>

<View android:layout_width="match_parent"

android:layout_height="1dp"

android:background="#d8d8d8"/>

<LinearLayout

android:layout_width="match_parent"

android:layout_height="160dip"

android:orientation="horizontal"

android:gravity="center_vertical">

<com.example.user.myapplication.wheelview.WheelView

android:id="@+id/wv_address_province"

android:layout_width="0dip"

android:layout_weight="1"

android:layout_height="match_parent"

android:layout_gravity="center_vertical"

/>

<com.example.user.myapplication.wheelview.WheelView

android:id="@+id/wv_address_city"

android:layout_width="0dip"

android:layout_weight="1"

android:layout_height="match_parent"

android:layout_gravity="center_vertical"

/>

<com.example.user.myapplication.wheelview.WheelView

android:id="@+id/wv_address_area"

android:layout_width="0dip"

android:layout_weight="1"

android:layout_height="match_parent"

android:layout_gravity="center_vertical"

/>

</LinearLayout>

</LinearLayout>

</LinearLayout>

运行效果图:



源代码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: