GitHub has an open source control PickerView, which can achieve three-level linkage effect. Although this control is very simple to use, it is extremely cumbersome to fill data. Demos on GitHub are filled one by one when filling data, and the code is too redundant. Here is a simple way to implement it.
(1) Create a new assets folder in the app directory and copy the province_data.xml file to the folder. The XML file saves the address data of provinces, cities and counties across the country.
(2) Use SAX to parse the data in the xml file and fill the data into the PickerView control.
—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) { = name; } public List<CityModel> getCityList() { return cityList; } public void setCityList(List<CityModel> 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) { = name; } public List<DistrictModel> getDistrictList() { return districtList; } public void setDistrictList(List<DistrictModel> 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) { = zipcode; } public String getName() { return name; } public void setName(String name) { = name; } @Override public String toString() { return name; } @Override public String getPickerViewText() { return name; } }
—XmlParserHandler—
public class XmlParserHandler extends DefaultHandler { /** * Store all parsed objects */ 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 { (); } @Override public void endDocument() throws SAXException { (); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (("province")) { provinceModel = new ProvinceModel(); ((0)); (new ArrayList<CityModel>()); } else if (("city")) { cityModel = new CityModel(); ((0)); (new ArrayList<DistrictModel>()); } else if (("district")) { districtModel = new DistrictModel(); ((0)); ((1)); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(("district")) { ().add(districtModel); } else if(("city")) { ().add(cityModel); } else if(("province")) { (provinceModel); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { (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) { (savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(.activity_address_add); (this); init(); } private void init() { initProvinceDatas(); try { //Option selector mCityPickerView = new OptionsPickerView(this); ( mProvinces, mCities, mDistricts, true); ("Choose a city"); (false, false , false); (new () { @Override public void onOptionsSelect(int options1, int option2, int options3) { String address = (options1).getName() + " " + (options1).get(option2) + " " + (options1).get(option2).get(options3); (address); } }); } catch (Exception e) { (); } } @OnClick(.ll_city_picker) public void showpickerView(View view) { (); } protected void initProvinceDatas() { AssetManager asset = getAssets(); try { InputStream input = ("province_data.xml"); SAXParserFactory spf = (); SAXParser parser = (); XmlParserHandler handler = new XmlParserHandler(); (input , handler); (); //Get parsed data mProvinces = (ArrayList<ProvinceModel>) (); } catch (Throwable e) { (); } if (mProvinces != null) { for (ProvinceModel p : mProvinces) { List<CityModel> cities = (); //Assemble city data ((ArrayList<CityModel>) cities); ArrayList<ArrayList<DistrictModel>> dts = new ArrayList<>(); for (CityModel c : cities) { List<DistrictModel> districts = (); ((ArrayList<DistrictModel>) districts); } (dts); } } } }
This is a very simple example.
The above is all the content of this article. I hope it will be helpful to everyone's study and I hope everyone will support me more.