增加收货地址

本文介绍如何在Android应用中使用开源控件PickerView实现收货地址选择功能,包括时间选择器和选项选择器,支持XML数据解析,三级联动效果。详细步骤包括XML数据解析、初始化PickerView、添加监听器以及将选中地址提交至服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1)开源控件PickerView

GitHub地址:https://github.com/saiwu-bigkoo/Android-PickerView

精仿iOSPickerView控件,有时间选择和选项选择并支持一二三级联动效果
——TimePickerView 时间选择器,支持年月日时分,年月日,年月,时分等格式
——OptionsPickerView 选项选择器,支持一,二,三级选项选择,并且可以设置是否联动

依赖:compile 'com.bigkoo:pickerview:2.0.8'

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

options3Items.add(options3Items_01);

options3Items.add(options3Items_02);

options3Items.add(options3Items_03);

//三级联动效果

pvOptions.setPicker(options1Items, options2Items, options3Items, true);

//设置选择的三级单位

// pwOptions.setLabels("省", "市", "区");

pvOptions.setTitle("选择城市");

pvOptions.setCyclic(falsetruetrue);

//设置默认选中的三级项目

//监听确定选择按钮

pvOptions.setSelectOptions(111);

pvOptions.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {

 

@Override

public void onOptionsSelect(int options1int option2int options3) {

//返回的分别是三个级别的选中位置

String tx = options1Items.get(options1).getPickerViewText()

+ options2Items.get(options1).get(option2)

+ options3Items.get(options1).get(option2).get(options3);

     tvOptions.setText(tx);

    vMasker.setVisibility(View.GONE);

}

});

//点击弹出选项选择器

tvOptions.setOnClickListener(new View.OnClickListener() {

 

@Override

public void onClick(View v) {

     pvOptions.show();

}

});

}

 

①解析xml文件

public class ProvinceModel {
   private String name;
   private List<CityModel> cityList;

}

public class CityModel {
   private String name;
   private List<DistrictModel> districtList;

}

public class DistrictModel {
   private String name;
   private String zipcode;

}

 

解析XML工具类

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XmlParserHandler extends DefaultHandler {

   /**
    * 存储所有的解析对象
    */
   
private List<ProvinceModel> provinceList new ArrayList<ProvinceModel>();

   public XmlParserHandler() {

   }

   public List<ProvinceModel> getDataList() {
      return provinceList;
   }

   @Override
   public void startDocument() throws SAXException {
      // 当读到第一个开始标签的时候,会触发这个方法
   }

   ProvinceModel provinceModel new ProvinceModel();
   CityModel cityModel new CityModel();
   DistrictModel districtModel new DistrictModel();

   @Override
   public void startElement(String uriString localNameString qName,
                      Attributes attributes) throws SAXException {
      // 当遇到开始标记的时候,调用这个方法
      if (qName.equals("province")) {
         provinceModel new ProvinceModel();
         provinceModel.setName(attributes.getValue(0));
         provinceModel.setCityList(new ArrayList<CityModel>());
      else if (qName.equals("city")) {
         cityModel new CityModel();
         cityModel.setName(attributes.getValue(0));
         cityModel.setDistrictList(new ArrayList<DistrictModel>());
      else if (qName.equals("district")) {
         districtModel new DistrictModel();
         districtModel.setName(attributes.getValue(0));
         districtModel.setZipcode(attributes.getValue(1));
      }
   }

   @Override
   public void endElement(String uriString localNameString qName)
         throws SAXException {
      // 遇到结束标记的时候,会调用这个方法
      if (qName.equals("district")) {
         cityModel.getDistrictList().add(districtModel);
      else if (qName.equals("city")) {
         provinceModel.getCityList().add(cityModel);
      else if (qName.equals("province")) {
         provinceList.add(provinceModel);
      }
   }

   @Override
   public void characters(char[] ch, int start, int length)
         throws SAXException {
   }
}

 

②解析assets目录下的xml文件:

AssetManager asset = getAssets();
try {
    InputStream input = asset.open("province_data.xml");
    // 创建一个解析xml的工厂对象
    SAXParserFactory spf = SAXParserFactory.newInstance();
    // 解析xml
    SAXParser parser = spf.newSAXParser();
    XmlParserHandler handler = new XmlParserHandler();
    parser.parse(inputhandler);
    input.close();
    // 获取解析出来的数据
    mProvinces = handler.getDataList();
catch (Throwable e) {
    e.printStackTrace();
finally { }

 

③将数据解析至List中:

if(mProvinces !=null){
    for (ProvinceModel p :mProvinces){
        List<CityModel> cities =  p.getCityList();
        ArrayList<String> cityStrs = new ArrayList<>(cities.size())//城市List

        for (CityModel c :cities){
            cityStrs.add(c.getName())// 把城市名称放入 cityStrs
            ArrayList<ArrayList<String>> dts = new ArrayList<>()// 地区 List

            List<DistrictModel> districts = c.getDistrictList();
            ArrayList<String> districtStrs = new ArrayList<>(districts.size());
            for (DistrictModel d : districts){
                districtStrs.add(d.getName())// 把城市名称放入 districtStrs
            }
            
            dts.add(districtStrs);
            mDistricts.add(dts);
        }
        mCities.add(cityStrs)// 组装城市数据
    }
}

 

④初始化PickerView

private void init() {

    initProvinceDatas();
    mCityPikerView new OptionsPickerView(this);

    mCityPikerView.setPicker((ArrayList) mProvinces,mCities,mDistricts,true);
    mCityPikerView.setTitle("选择城市");
    mCityPikerView.setCyclic(false,true,true);
    mCityPikerView.setSelectOptions(111);
    ....
}

 

⑤为PickerView添加监听器,显示PickerView

@OnClick(R.id.ll_city_picker)
public void showCityPickerView(View view){
    mCityPikerView.show();
}

 

⑥当点击PickerView的完成后,添加完成监听器:

mCityPikerView.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() {
    @Override
    public void onOptionsSelect(int options1, int option2, int options3) {

        String addresss = mProvinces.get(options1).getName() +"  "
                mCities.get(options1).get(option2)+"  "
                mDistricts.get(options1).get(option2).get(options3);
        mTxtAddress.setText(addresss);

    }
});

 

⑦将添加的收货地址提交至服务端:

String consignee = mEditConsignee.getText().toString();
String phone = mEditPhone.getText().toString();
final String address = mTxtAddress.getText().toString() + mEditAddr.getText().toString();

ToastUtils.show(NyAddressActivity.this, address);
Map<String,String > params = new HashMap<>(1);
params.put("user_id",ShoppingApplication.getInstance().getUser().getId() + "");
params.put("consignee",consignee);
params.put("phone",phone);
params.put("addr",address);
params.put("zip_code","000000");

mHttpHelper.post(Contants.API.ADDRESS_CREATEparams, new SpotsCallBack<BaseRespMsg>(this) {
    @Override
    public void onSuccess(Response responseBaseRespMsg baseRespMsg) {
        if(baseRespMsg.getStatus() == BaseRespMsg.STATUS_SUCCESS){
            setResult(RESULT_OK);
            ToastUtils.show(NyAddressActivity.this, address);
            finish();
        }
    }

    @Override
    public void onError(Response response, int codeException e) {

    }
});

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值