Android PickerView實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)效果
GitHub有一個(gè)開源控件PickerView,可以實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的效果。雖然該控件使用非常簡(jiǎn)單,但是填充數(shù)據(jù)異常繁瑣。GitHub上的Demo在填充數(shù)據(jù)的時(shí)候是一條一條地填充的,代碼過于冗余。下面提供一種簡(jiǎn)便的方式來實(shí)現(xiàn)。
(1)在app目錄下新建一個(gè)assets文件夾,將province_data.xml文件復(fù)制到該文件夾下,該XML文件里保存了全國(guó)的省市縣的地址數(shù)據(jù)。
(2)使用SAX解析xml文件中的數(shù)據(jù),并將數(shù)據(jù)填充到PickerView這個(gè)控件中。
—ProvinceModel—
public class ProvinceModel implements IPickerViewData { private String name; private List<CityModel> cityList; public ProvinceModel() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<CityModel> getCityList() { return cityList; } public void setCityList(List<CityModel> cityList) { this.cityList = cityList; } @Override public String getPickerViewText() { return name; } }
—CityModel—
public class CityModel implements IPickerViewData { private String name; private List<DistrictModel> districtList; public CityModel() { super(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<DistrictModel> getDistrictList() { return districtList; } public void setDistrictList(List<DistrictModel> districtList) { this.districtList = districtList; } @Override public String toString() { return name; } @Override public String getPickerViewText() { return name; } }
—DistrictModel—
public class DistrictModel implements IPickerViewData { private String name; private String zipcode; public DistrictModel() { super(); } public String getZipcode() { return zipcode; } public void setZipcode(String zipcode) { this.zipcode = zipcode; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return name; } @Override public String getPickerViewText() { return name; } }
—XmlParserHandler—
public class XmlParserHandler extends DefaultHandler { /** * 存儲(chǔ)所有的解析對(duì)象 */ private List<ProvinceModel> provinceList = new ArrayList<>(); private ProvinceModel provinceModel = new ProvinceModel(); private CityModel cityModel = new CityModel(); private DistrictModel districtModel = new DistrictModel(); public XmlParserHandler(){} public List<ProvinceModel> getDataList() { return provinceList; } @Override public void startDocument() throws SAXException { super.startDocument(); } @Override public void endDocument() throws SAXException { super.endDocument(); } @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 { super.characters(ch, start, length); } }
public class AddressAddActivity extends BaseActivity { private OptionsPickerView mCityPickerView; private ArrayList<ProvinceModel> mProvinces = new ArrayList<>(); private ArrayList<ArrayList<CityModel>> mCities = new ArrayList<>(); private ArrayList<ArrayList<ArrayList<DistrictModel>>> mDistricts = new ArrayList<>(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_address_add); ViewUtils.inject(this); init(); } private void init() { initProvinceDatas(); try { //選項(xiàng)選擇器 mCityPickerView = new OptionsPickerView(this); mCityPickerView.setPicker( mProvinces, mCities, mDistricts, true); mCityPickerView.setTitle("選擇城市"); mCityPickerView.setCyclic(false, false , false); mCityPickerView.setOnoptionsSelectListener(new OptionsPickerView.OnOptionsSelectListener() { @Override public void onOptionsSelect(int options1, int option2, int options3) { String address = mProvinces.get(options1).getName() + " " + mCities.get(options1).get(option2) + " " + mDistricts.get(options1).get(option2).get(options3); mTxtAddress.setText(address); } }); } catch (Exception e) { e.printStackTrace(); } } @OnClick(R.id.ll_city_picker) public void showpickerView(View view) { mCityPickerView.show(); } protected void initProvinceDatas() { AssetManager asset = getAssets(); try { InputStream input = asset.open("province_data.xml"); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XmlParserHandler handler = new XmlParserHandler(); parser.parse(input , handler); input.close(); //獲取解析出來的數(shù)據(jù) mProvinces = (ArrayList<ProvinceModel>) handler.getDataList(); } catch (Throwable e) { e.printStackTrace(); } if (mProvinces != null) { for (ProvinceModel p : mProvinces) { List<CityModel> cities = p.getCityList(); //組裝城市數(shù)據(jù) mCities.add((ArrayList<CityModel>) cities); ArrayList<ArrayList<DistrictModel>> dts = new ArrayList<>(); for (CityModel c : cities) { List<DistrictModel> districts = c.getDistrictList(); dts.add((ArrayList<DistrictModel>) districts); } mDistricts.add(dts); } } } }
到此完畢,很簡(jiǎn)單的例子。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Android短信驗(yàn)證碼的獲取的示例
本篇文章主要介紹了關(guān)于Android短信驗(yàn)證碼的獲取的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Android 中的危險(xiǎn)權(quán)限詳細(xì)整理
這篇文章主要介紹了Android 中的危險(xiǎn)權(quán)限詳細(xì)整理的相關(guān)資料,Android 中有上百種權(quán)限,現(xiàn)在將所有的權(quán)限歸為兩類,一類是普通權(quán)限,一類的危險(xiǎn)權(quán)限,危險(xiǎn)權(quán)限則表示那些可能會(huì)觸及到用戶安全隱私或者對(duì)設(shè)備安全造成影響的權(quán)限,需要的朋友可以參考下2017-07-07Android項(xiàng)目實(shí)現(xiàn)視頻播放器
這篇文章主要為大家詳細(xì)介紹了Android項(xiàng)目實(shí)現(xiàn)視頻播放器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Android項(xiàng)目實(shí)戰(zhàn)之百度地圖地點(diǎn)簽到功能
這篇文章主要介紹了Android項(xiàng)目實(shí)戰(zhàn)之百度地圖地點(diǎn)簽到功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04Android動(dòng)畫之小球擬合動(dòng)畫實(shí)例
這篇文章主要介紹了Android動(dòng)畫之小球擬合動(dòng)畫實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07Android自定義控件之創(chuàng)建可復(fù)用的組合控件
這篇文章主要為大家詳細(xì)介紹了Android自定義控件之創(chuàng)建可復(fù)用的組合控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android開發(fā)實(shí)現(xiàn)的自動(dòng)換圖片、輪播圖效果示例
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)的自動(dòng)換圖片、輪播圖效果,涉及Android ImageView及界面布局相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Android通過手勢(shì)實(shí)現(xiàn)答題器翻頁(yè)效果
這篇文章主要為大家詳細(xì)介紹了Android通過手勢(shì)實(shí)現(xiàn)答題器翻頁(yè)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05Android 5秒學(xué)會(huì)使用手勢(shì)解鎖功能
本文講述的是一個(gè)手勢(shì)解鎖的庫(kù),可以定制顯示隱藏宮格點(diǎn)、路徑、并且?guī)в行【艑m格顯示圖,和震動(dòng)!讓你學(xué)會(huì)使用這個(gè)簡(jiǎn)單,高效的庫(kù),好了,具體內(nèi)容詳情大家通過本文學(xué)習(xí)吧2017-12-12