Android仿JD選擇地區

注:您正在查看一篇停止維護的博客,只供借鑑參考,後期會提供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;
		}
	}
}


運行結果如下:

 

下載地址:點擊打開鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章