1)开源控件PickerView
GitHub地址:https://github.com/saiwu-bigkoo/Android-PickerView
精仿iOS的PickerView控件,有时间选择和选项选择并支持一二三级联动效果
——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(false, true, true); | |||
//设置默认选中的三级项目 | |||
//监听确定选择按钮 | |||
pvOptions.setSelectOptions(1, 1, 1); | |||
pvOptions.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() { | |||
| |||
@Override | |||
public void onOptionsSelect(int options1, int option2, int 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 uri, String localName, String 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 uri, String localName, String 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(input, handler);
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(1, 1, 1);
....
}
⑤为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_CREATE, params, new SpotsCallBack<BaseRespMsg>(this) {
@Override
public void onSuccess(Response response, BaseRespMsg baseRespMsg) {
if(baseRespMsg.getStatus() == BaseRespMsg.STATUS_SUCCESS){
setResult(RESULT_OK);
ToastUtils.show(NyAddressActivity.this, address);
finish();
}
}
@Override
public void onError(Response response, int code, Exception e) {
}
});