注:您正在查看一篇停止維護的博客,只供借鑑參考,後期會提供kotlin版本的demo
整個對話框是建立在一個DialogFragment上面的,DialogFragment在android 3.0時被引入。是一種特殊的Fragment,用於在Activity的內容之上展示一個模態的對話框。
組成結構:DialogFragment+PagerSlidingTabStrip +ViewPager,使用ViewPager來切換省市區的選擇,PagerSlidingTabStrip 作爲頭部tap展示已選擇的信息,點擊已選中的信息tap可以返回重新選擇。
主結構代碼:
package sad.zzq.com.selectaddressdemo.views;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import java.util.ArrayList;
import java.util.List;
import sad.zzq.com.selectaddressdemo.callback.AddressCallBack;
import sad.zzq.com.selectaddressdemo.adapter.AddressListAdapter;
import sad.zzq.com.selectaddressdemo.manager.AddressManager;
import sad.zzq.com.selectaddressdemo.MainActivity;
import sad.zzq.com.selectaddressdemo.R;
import sad.zzq.com.selectaddressdemo.callback.TabOnClickListener;
import sad.zzq.com.selectaddressdemo.fragment.CityFragment;
import sad.zzq.com.selectaddressdemo.fragment.DistrictFragment;
import sad.zzq.com.selectaddressdemo.fragment.ProvinceFragment;
import sad.zzq.com.selectaddressdemo.tool.DensityUtils;
import sad.zzq.com.selectaddressdemo.tool.StringUtils;
/**
* Created by zzq on 16/9/26.
*/
public class SelectAddressPop extends DialogFragment implements AddressCallBack {
private MainActivity.SelectAddresFinish mSelectAddresFinish;
private Context context;
private View view;
private ViewPager viewPager;
private PagerSlidingTabStrip pagerTab;
private FrameLayout popBg;
private AddressManager.Province province;
private AddressManager.City city ;
private AddressManager.District district;
private String defutText;
private ProvinceFragment mProvinceFragment;
private CityFragment mCityFragment;
private DistrictFragment mDistrictFragment;
public void setSelectAddresFinish(MainActivity.SelectAddresFinish mSelectAddresFinish) {
this.mSelectAddresFinish = mSelectAddresFinish;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
context = getActivity();
initView();
Dialog dialog = new Dialog(context, R.style.CustomDatePickerDialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // must be called before set content
dialog.setContentView(view);
dialog.setCanceledOnTouchOutside(true);
// 設置寬度爲屏寬、靠近屏幕底部。
Window window = dialog.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();
wlp.gravity = Gravity.BOTTOM;
wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(wlp);
return dialog;
}
public void setAddress(String pCode, String cCode, String aCode){
if (StringUtils.isNoEmpty(pCode) && StringUtils.isNoEmpty(cCode) && StringUtils.isNoEmpty(aCode)){
province = AddressManager.newInstance().findProvinceByCode(pCode);
city = province.findCityByCode(cCode);
district = city.findDistrictByCode(aCode);
}
}
private void initView() {
view = LayoutInflater.from(context).inflate(R.layout.select_address_pop_layout,null);
ImageView ivClose = (ImageView) view.findViewById(R.id.ivClose);
viewPager = (ViewPager) view.findViewById(R.id.viewPager);
pagerTab = (PagerSlidingTabStrip) view.findViewById(R.id.pagerTab);
popBg = (FrameLayout)view.findViewById(R.id.popBg);
defutText = context.getString(R.string.selset_birthday);
pagerTab.setTextSize(DensityUtils.sp2px(context, 14));
pagerTab.setSelectedColor(getResources().getColor(R.color.new_redbg));
pagerTab.setTextColor(getResources().getColor(R.color.regis_account_exist));
List<View> lis = new ArrayList<View>();
mProvinceFragment = new ProvinceFragment(context,this);
mCityFragment = new CityFragment(context,this);
mDistrictFragment = new DistrictFragment(context,this);
lis.add(mProvinceFragment.getListview());
lis.add(mCityFragment.getListview());
lis.add(mDistrictFragment.getListview());
viewPager.setAdapter(new AddressListAdapter(lis));
String[] addres = null;
if (province != null && city != null && district != null){
addres = new String[]{province.getName(),city.getName(),district.getName()};
mProvinceFragment.setCode(province.getCode());
mCityFragment.setCode(province.getCode(),city.getCode());
mDistrictFragment.setCode(province.getCode(),city.getCode(),district.getCode());
viewPager.setCurrentItem(2);
pagerTab.setTabsText(addres);
pagerTab.setCurrentPosition(2);
}else{
addres = new String[]{defutText};
viewPager.setCurrentItem(0);
pagerTab.setTabsText(addres);
pagerTab.setCurrentPosition(0);
}
ivClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
popBg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
pagerTab.setTabOnClickListener(new TabOnClickListener() {
@Override
public void onClick(View tab, int position) {
if (defutText.equals(pagerTab.getTabs()[position])){
return;
}
viewPager.setCurrentItem(position);
String[] addres = null;
switch (position){
case 0:
if (district != null) {
addres = new String[]{province.getName(), city.getName(),district.getName()};
}else if(city != null) {
addres = new String[]{province.getName(), city.getName(), defutText};
}else{
addres = new String[]{province.getName(), defutText};
}
break;
case 1:
if (district != null) {
addres = new String[]{province.getName(), city.getName(),district.getName()};
}else {
addres = new String[]{province.getName(), city.getName(), defutText};
}
//mDistrictFragment.resetIndex();
break;
case 2:
addres = new String[]{province.getName(),city.getName(),district.getName()};
break;
}
pagerTab.setTabsText(addres);
pagerTab.setCurrentPosition(position);
}
});
}
@Override
public void show(FragmentManager manager, String tag) {
//KeyBoardUtils.closeKeybord((Activity) context);
super.show(manager, tag);
}
@Override
public void selectProvince(AddressManager.Province province) {
String[] addres = new String[]{province.getName(),defutText};
pagerTab.setTabsText(addres);
pagerTab.setCurrentPosition(1);
viewPager.setCurrentItem(1);
if(province != this.province){
city = null;
district = null;
}
this.province = province;
mCityFragment.setCode(province.getCode(),null);
}
@Override
public void selectCity(AddressManager.City city) {
String[] addres = new String[]{province.getName(),city.getName(),defutText};
pagerTab.setTabsText(addres);
pagerTab.setCurrentPosition(2);
viewPager.setCurrentItem(2);
if(city != this.city){
district = null;
}
this.city = city;
mDistrictFragment.setCode(province.getCode(),city.getCode(),null);
}
@Override
public void selectDistrict(AddressManager.District district) {
String[] addres = new String[]{province.getName(),city.getName(),district.getName()};
pagerTab.setTabsText(addres);
this.district = district;
mSelectAddresFinish.finish(province.getCode(),city.getCode(),district.getCode());
dismiss();
}
}
在selectDistrict()方法中當用戶選擇完區後會自動關閉對話框並調用回調接口的finish()方法進行回顯
這個回調接口定義在主Activity中
package sad.zzq.com.selectaddressdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import org.xutils.view.annotation.ViewInject;
import org.xutils.x;
import sad.zzq.com.selectaddressdemo.manager.AddressManager;
import sad.zzq.com.selectaddressdemo.views.SelectAddressPop;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
//收貨人
@ViewInject(R.id.edit_consignee)
private EditText consignee;
//手機號
@ViewInject(R.id.edit_phone_num)
private EditText phoneNum;
//區縣地址
@ViewInject(R.id.edit_adress)
private EditText adress;
//詳細地址
@ViewInject(R.id.edit_detail_address)
private EditText detailAddress;
private String provinceCode ;
private String cityCode;
private String areaCode;
private View rootView;
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
rootView = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
setContentView(rootView);
x.view().inject(this);
adress.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.edit_adress) {
SelectAddressPop pop = new SelectAddressPop();
pop.setSelectAddresFinish(new SelectAddresFinish(){
@Override
public void finish(String pCode, String cCode, String aCode) {
//選中地址完成
provinceCode = pCode;
cityCode = cCode;
areaCode = aCode;
String addr = AddressManager.newInstance().getAddress(pCode, cCode, aCode);
adress.setText(addr);
}
});
pop.setAddress(provinceCode,cityCode,areaCode);
pop.show(getFragmentManager(),"address");
}
}
public interface SelectAddresFinish{
void finish(String provinceCode, String cityCode, String areaCode);
}
}
爲了方便項目引入了xutils3.0的框架
下面是展示省市區的代碼
ProvinceFragment.java:
package sad.zzq.com.selectaddressdemo.fragment;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.List;
import sad.zzq.com.selectaddressdemo.callback.AddressCallBack;
import sad.zzq.com.selectaddressdemo.manager.AddressManager;
import sad.zzq.com.selectaddressdemo.R;
/**
* Created by zzq on 16/9/26.
*/
public class ProvinceFragment implements AdapterView.OnItemClickListener{
private AddressCallBack callBack;
private String code;
private Context context;
private AddressAdapter adapter;
private ListView listview;
public ProvinceFragment(Context context, AddressCallBack callBack){
this.context = context;
this.callBack = callBack;
initView();
}
public void setCode(String code){
this.code = code;
}
public ListView getListview() {
return listview;
}
public View initView() {
listview = (ListView) LayoutInflater.from(context).inflate(R.layout.select_address_pop_listview,null);
adapter = new AddressAdapter(AddressManager.newInstance().getAllProvinces());
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);
return listview;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
code = AddressManager.newInstance().getAllProvinces().get(i).getCode();
if (callBack != null){
callBack.selectProvince(AddressManager.newInstance().getAllProvinces().get(i));
}
adapter.notifyDataSetChanged();
}
class AddressAdapter extends BaseAdapter {
private List<AddressManager.Province> list;
public AddressAdapter(List<AddressManager.Province> list){
this.list = list;
}
@Override
public int getCount() {
if (list != null) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = LayoutInflater.from(context).inflate(R.layout.address_listiew_item_textview, null);
TextView text = (TextView) view.findViewById(R.id.tvTextName);
ImageView ivSelect = (ImageView) view.findViewById(R.id.ivSelect);
text.setText(list.get(i).getName());
if (list.get(i).getCode().equals(code)) {
text.setTextColor(context.getResources().getColor(R.color.new_redbg));
ivSelect.setVisibility(View.VISIBLE);
}
return view;
}
}
}
CityFragment.java:
package sad.zzq.com.selectaddressdemo.fragment;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import sad.zzq.com.selectaddressdemo.callback.AddressCallBack;
import sad.zzq.com.selectaddressdemo.manager.AddressManager;
import sad.zzq.com.selectaddressdemo.R;
import sad.zzq.com.selectaddressdemo.tool.StringUtils;
/**
* Created by zzq on 16/9/26.
*/
public class CityFragment implements AdapterView.OnItemClickListener{
private AddressCallBack callBack;
private String code;
private Context context;
private AddressAdapter adapter;
private ListView listview;
private String provinceCode;
private List<AddressManager.City> cityList = new ArrayList<AddressManager.City>();
public CityFragment(Context context, AddressCallBack callBack){
this.context = context;
this.callBack = callBack;
initView();
}
public void setCode(String provinceCode,String code){
if (!provinceCode.equals(this.provinceCode)){
this.code = null;
}
if (StringUtils.isNoEmpty(code)){
this.code = code;
}
this.provinceCode = provinceCode;
cityList.clear();
cityList.addAll(AddressManager.newInstance().findProvinceByCode(provinceCode).getAllCities());
adapter.notifyDataSetChanged();
}
public ListView getListview() {
return listview;
}
public View initView() {
listview = (ListView) LayoutInflater.from(context).inflate(R.layout.select_address_pop_listview,null);
//cityList = AddressManager.newInstance().findProvinceByCode(provinceCode).getAllCities();
adapter = new AddressAdapter(cityList);
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);
return listview;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
code = cityList.get(i).getCode();
if (callBack != null){
callBack.selectCity(cityList.get(i));
}
adapter.notifyDataSetChanged();
}
class AddressAdapter extends BaseAdapter {
private List<AddressManager.City> list;
public AddressAdapter(List<AddressManager.City> list){
this.list = list;
}
@Override
public int getCount() {
if (list != null) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = LayoutInflater.from(context).inflate(R.layout.address_listiew_item_textview, null);
TextView text = (TextView) view.findViewById(R.id.tvTextName);
ImageView ivSelect = (ImageView) view.findViewById(R.id.ivSelect);
text.setText(list.get(i).getName());
if (list.get(i).getCode().equals(code)) {
text.setTextColor(context.getResources().getColor(R.color.new_redbg));
ivSelect.setVisibility(View.VISIBLE);
}
return view;
}
}
}
DistrictFragment.java:
package sad.zzq.com.selectaddressdemo.fragment;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import sad.zzq.com.selectaddressdemo.callback.AddressCallBack;
import sad.zzq.com.selectaddressdemo.manager.AddressManager;
import sad.zzq.com.selectaddressdemo.R;
import sad.zzq.com.selectaddressdemo.tool.StringUtils;
/**
* Created by zzq on 16/9/26.
*/
public class DistrictFragment implements AdapterView.OnItemClickListener{
private AddressCallBack callBack;
private String code ;
private Context context;
private AddressAdapter adapter;
private ListView listview;
private String provinceCode;
private String cityCode;
private List<AddressManager.District> districtsList = new ArrayList<AddressManager.District>();
public DistrictFragment(Context context, AddressCallBack callBack){
this.context = context;
this.callBack = callBack;
initView();
}
public void setCode(String provinceCode,String cityCode,String code){
if (!provinceCode.equals(this.provinceCode) || !cityCode.equals(this.cityCode)){
this.code = null;
}
if (StringUtils.isNoEmpty(code)){
this.code = code;
}
this.cityCode = cityCode;
this.provinceCode = provinceCode;
districtsList.clear();
districtsList.addAll(AddressManager.newInstance().findProvinceByCode(provinceCode)
.findCityByCode(cityCode).getAllDistricts());
adapter.notifyDataSetChanged();
}
public ListView getListview() {
return listview;
}
public View initView() {
listview = (ListView) LayoutInflater.from(context).inflate(R.layout.select_address_pop_listview,null);
//districtsList = AddressManager.newInstance().findProvinceByCode(provinceCode).findCityByCode(cityCode).getAllDistricts();
adapter = new AddressAdapter(districtsList);
listview.setAdapter(adapter);
listview.setOnItemClickListener(this);
return listview;
}
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
code = districtsList.get(i).getCode();
if (callBack != null){
callBack.selectDistrict(districtsList.get(i));
}
adapter.notifyDataSetChanged();
}
class AddressAdapter extends BaseAdapter {
private List<AddressManager.District> list;
public AddressAdapter(List<AddressManager.District> list){
this.list = list;
}
@Override
public int getCount() {
if (list != null) {
return list.size();
}
return 0;
}
@Override
public Object getItem(int i) {
return list.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = LayoutInflater.from(context).inflate(R.layout.address_listiew_item_textview, null);
TextView text = (TextView) view.findViewById(R.id.tvTextName);
ImageView ivSelect = (ImageView) view.findViewById(R.id.ivSelect);
text.setText(list.get(i).getName());
if (list.get(i).getCode().equals(code)) {
text.setTextColor(context.getResources().getColor(R.color.new_redbg));
ivSelect.setVisibility(View.VISIBLE);
}
return view;
}
}
}
那麼我們的數據從何而來
這是一個數據庫文件,是從服務器請求下來保存爲db文件的
那麼如何操作這個文件就需要用到下面的類了:
package sad.zzq.com.selectaddressdemo.manager;
import android.content.Context;
import android.database.Cursor;
import android.os.Environment;
import android.util.Log;
import org.xutils.DbManager;
import org.xutils.ex.DbException;
import org.xutils.x;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import sad.zzq.com.selectaddressdemo.MyApplication;
import sad.zzq.com.selectaddressdemo.R;
import sad.zzq.com.selectaddressdemo.modle.ReceiveAddress;
/**
* 地址管理類,包括更新、刪除、添加地址,以及從數據庫中讀取所有省、市、區信息
* @author zzq
*
*/
public class AddressManager{
public static final int VERSION = 1;
private static AddressManager ins = null;
public synchronized static AddressManager newInstance()
{
if(ins == null) {
ins = new AddressManager();
}
return ins;
}
protected AddressManager()
{
initDataFromDB();
}
/**
* 從數據庫中讀取所有的省、市、區
*/
private void initDataFromDB()
{
final String DB_NAME = "adressdb.db"; //保存的數據庫文件名
final String PACKAGE_NAME = MyApplication.getContext().getPackageName();
final String DB_PATH = "/data"
+ Environment.getDataDirectory().getAbsolutePath() + "/"
+ PACKAGE_NAME; //在手機裏存放數據庫的位置
final String dbfile = DB_PATH + "/" + DB_NAME;
copyDBAsNeeded(dbfile);
DbManager.DaoConfig config = new DbManager.DaoConfig();
config.setDbName(DB_NAME); //db名
config.setDbDir(new File(DB_PATH));
config.setDbVersion(VERSION);
DbManager manager = x.getDb(config);
try {
Cursor cursor = manager.execQuery("select * from com_wjy_db_Adress where pcode='china'");
while(cursor.moveToNext()) {
String provinceName = cursor.getString(cursor.getColumnIndex("name"));
String provinceCode = cursor.getString(cursor.getColumnIndex("code"));
Province province = new Province(provinceName, provinceCode);
provinces.add(province);
readCitiesOfProvince(manager, province);
}
manager.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private List<Province> provinces = new ArrayList<Province>();
/**
* 獲取數據庫中讀取的所有省信息
* @return
*/
public List<Province> getAllProvinces()
{
return provinces;
}
public int getProvinceCount()
{
return provinces.size();
}
/**
* 通過省或直轄市的code找到省或直轄市
* @param code 省或直轄市的code,如:110000表示北京市
* @return
*/
public Province findProvinceByCode(String code)
{
for(Province province : provinces) {
if(province.getCode().equals(code)) {
return province;
}
}
return null;
}
/**
* 根據省或直轄市的名稱找到省或直轄市的信息
* @param name 省名稱,如:北京市
* @return
*/
public Province findProvinceByName(String name)
{
for(Province province : provinces) {
if(province.getName().equals(name)) {
return province;
}
}
return null;
}
/**
* 通過省、市和區三個code獲得詳細地址信息
* @param provinceCode 省或直轄市code,如110000,表示北京
* @param cityCode 市code,如110100,表示市轄區
* @param districtCode,區code,如110101,表示東城區
* 例如三個code分別是110000, 110100, 110101,則輸出爲北京市市轄區東城區
* @return
*/
public String getAddress(String provinceCode, String cityCode, String districtCode)
{
String addr = "";
Province province = findProvinceByCode(provinceCode);
if(province != null) {
addr += province.getName();
City city = province.findCityByCode(cityCode);
if(city != null) {
addr += city.getName();
District district = city.findDistrictByCode(districtCode);
if(district != null) {
addr += district.getName();
}
}
}
return addr;
}
private void copyDBAsNeeded(String dbfile)
{
final int BUFFER_SIZE = 1024;
try {
if (!(new File(dbfile).exists())) {//判斷數據庫文件是否存在,若不存在則執行導入,否則直接打開數據庫
InputStream is = MyApplication.getContext().getResources().openRawResource(
R.raw.adressdb); //欲導入的數據庫
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
} catch (FileNotFoundException e) {
Log.e("Database", "File not found");
e.printStackTrace();
} catch (IOException e) {
Log.e("Database", "IO exception");
e.printStackTrace();
}
}
/**
* 從數據庫讀取某個省或直轄市下轄的市信息
* @param db
* @param province
*/
private void readCitiesOfProvince(DbManager db, Province province)
{
Cursor cursor = null;
try {
cursor = db.execQuery("select * from com_wjy_db_adress where pcode='" + province.code + "'");
while(cursor.moveToNext()) {
String cityName = cursor.getString(cursor.getColumnIndex("name"));
String cityCode = cursor.getString(cursor.getColumnIndex("code"));
City city = new City(cityName, cityCode, province.getCode());
readDistrictOfCity(db, city);
province.addCity(city);
}
} catch (DbException e) {
e.printStackTrace();
}finally {
if (cursor != null){
cursor.close();
}
}
}
/**
* 從數據庫讀取某個城市下轄的區信息
* @param db
* @param city
*/
private void readDistrictOfCity(DbManager db, City city)
{
Cursor cursor = null;
try {
cursor = db.execQuery("select * from com_wjy_db_adress where pcode='" + city.code + "'");
while(cursor.moveToNext()) {
String districtName = cursor.getString(cursor.getColumnIndex("name"));
String districtCode = cursor.getString(cursor.getColumnIndex("code"));
District district = new District(districtName, districtCode, city.getCode(), city.getProvinceCode());
city.addDistrict(district);
}
} catch (DbException e) {
e.printStackTrace();
}finally {
if (cursor != null){
cursor.close();
}
}
}
private List<ReceiveAddress> addresses = new ArrayList<ReceiveAddress>();
//緩存已選中的地址(本地數據) 做容錯處理
private Map<Integer,ReceiveAddress> selectAddresss = new HashMap<Integer,ReceiveAddress>();
public List<ReceiveAddress> getAllAddresses()
{
return addresses;
}
public void clear()
{
selectAddresss.clear();
clearSelectAddress();
}
/**
* 設置所有地址未選中
*/
public void clearSelectAddress()
{
for (ReceiveAddress address : addresses){
address.isSelected = false;
}
}
/**
* 是否已選中
*/
public boolean containsKeySelectAddress(int id)
{
return selectAddresss.containsKey(id);
}
/**
* 設置哪一個地址被選中或取消選中(多選)
* @param pos
*/
public void setSelectedAddress(int pos)
{
ReceiveAddress address = addresses.get(pos);
address.isSelected = !address.isSelected;
if (address.isSelected){
if (!selectAddresss.containsKey(address.id)) {
selectAddresss.put(address.id, address.clone());
}
}else{
if (selectAddresss.containsKey(address.id)) {
selectAddresss.remove(address.id);
}
}
}
/**
* 設置單個地址選中(單選)
* @param pos
*/
public void setSingleSelectedAddress(Context context,int pos)
{
for(int i = 0; i < addresses.size(); ++ i) {
ReceiveAddress address = addresses.get(i);
address.isSelected = i == pos;
}
}
/**
* 指定選項是否被選中
* @param pos
* @return
*/
public boolean isSelectAddressPos(int pos){
ReceiveAddress address = addresses.get(pos);
return address.isSelected;
}
/**
* 指定選項被選中
* @param id
* @return
*/
public void selectAddressId(int id){
ReceiveAddress address = getAddressById(id);
address.isSelected = true;
}
public List<Integer> getAllSelectedAddressIds()
{
ArrayList<Integer> indexes = new ArrayList<Integer>();
for(int i = 0; i < addresses.size(); ++ i) {
ReceiveAddress address = addresses.get(i);
if(address.isSelected) {
indexes.add(address.id);
}
}
return indexes;
}
public ReceiveAddress getAddressById(int id)
{
for(ReceiveAddress address : addresses) {
if(address.id == id) {
return address;
}
}
return null;
}
/**
* 省或直轄市類
* @author frontier
*
*/
public static class Province
{
private String name;
private String code;
public Province(String name, String code)
{
this.name = name;
this.code = code;
}
public String getName()
{
return name;
}
public String getCode()
{
return code;
}
/**
* 省或直轄市下轄的市列表
*/
private List<City> cities = new ArrayList<City>();
public void addCity(City city)
{
cities.add(city);
}
public List<City> getAllCities()
{
return cities;
}
/**
* 通過市的code查找市信息
* @param code
* @return
*/
public City findCityByCode(String code)
{
for(City city : cities) {
if(city.getCode().equals(code)) {
return city;
}
}
return null;
}
/**
* 通過市的名字查找市的信息
* @param name
* @return
*/
public City findCityByName(String name)
{
for(City city : cities) {
if(city.getName().equals(name)) {
return city;
}
}
return null;
}
public int getCityCount()
{
return cities.size();
}
}
/**
* 城市類
* @author frontier
*
*/
public static class City
{
private String name;
private String code;
private String provinceCode;
public City(String name, String code, String provinceCode)
{
this.name = name;
this.code = code;
this.provinceCode = provinceCode;
}
public String getName()
{
return name;
}
public String getCode()
{
return code;
}
public String getProvinceCode()
{
return provinceCode;
}
/**
* 城市下轄的區列表
*/
private List<District> districts = new ArrayList<District>();
public void addDistrict(District district)
{
districts.add(district);
}
public List<District> getAllDistricts()
{
return districts;
}
/**
* 通過區code獲得區信息
* @param code
* @return
*/
public District findDistrictByCode(String code)
{
for(District district : districts) {
if(district.getCode().equals(code)) {
return district;
}
}
return null;
}
/**
* 通過區的名稱獲得區的信息
* @param name
* @return
*/
public District findDistrictByName(String name)
{
for(District district : districts) {
if(district.getName().equals(name)) {
return district;
}
}
return null;
}
public int getDistrictCount()
{
return districts.size();
}
}
/**
* 區類
* @author frontier
*
*/
public static class District
{
private String name;
private String code;
private String cityCode;
private String provinceCode;
public District(String name, String code, String cityCode, String provinceCode)
{
this.name = name;
this.code = code;
this.cityCode = cityCode;
this.provinceCode = provinceCode;
}
public String getName()
{
return name;
}
public String getCode()
{
return code;
}
public String getCityCode()
{
return cityCode;
}
public String getProvinceCode()
{
return provinceCode;
}
}
}
運行結果如下:
下載地址:點擊打開鏈接