Android PickerView实现三级联动效果
GitHub有一个开源控件PickerView,可以实现三级联动的效果。虽然该控件使用非常简单,但是填充数据异常繁琐。GitHub上的Demo在填充数据的时候是一条一条地填充的,代码过于冗余。下面提供一种简便的方式来实现。
(1)在app目录下新建一个assets文件夹,将province_data.xml文件复制到该文件夹下,该XML文件里保存了全国的省市县的地址数据。
(2)使用SAX解析xml文件中的数据,并将数据填充到PickerView这个控件中。
—ProvinceModel—
publicclassProvinceModelimplementsIPickerViewData { privateStringname; privateListcityList; publicProvinceModel() { super(); } publicStringgetName() { returnname; } publicvoidsetName(Stringname) { this.name=name; } publicList getCityList() { returncityList; } publicvoidsetCityList(List cityList) { this.cityList=cityList; } @Override publicStringgetPickerViewText() { returnname; } }
—CityModel—
publicclassCityModelimplementsIPickerViewData { privateStringname; privateListdistrictList; publicCityModel() { super(); } publicStringgetName() { returnname; } publicvoidsetName(Stringname) { this.name=name; } publicList getDistrictList() { returndistrictList; } publicvoidsetDistrictList(List districtList) { this.districtList=districtList; } @Override publicStringtoString() { returnname; } @Override publicStringgetPickerViewText() { returnname; } }
—DistrictModel—
publicclassDistrictModelimplementsIPickerViewData { privateStringname; privateStringzipcode; publicDistrictModel() { super(); } publicStringgetZipcode() { returnzipcode; } publicvoidsetZipcode(Stringzipcode) { this.zipcode=zipcode; } publicStringgetName() { returnname; } publicvoidsetName(Stringname) { this.name=name; } @Override publicStringtoString() { returnname; } @Override publicStringgetPickerViewText() { returnname; } }
—XmlParserHandler—
publicclassXmlParserHandlerextendsDefaultHandler { /** *存储所有的解析对象 */ privateListprovinceList=newArrayList<>(); privateProvinceModelprovinceModel=newProvinceModel(); privateCityModelcityModel=newCityModel(); privateDistrictModeldistrictModel=newDistrictModel(); publicXmlParserHandler(){} publicList getDataList() { returnprovinceList; } @Override publicvoidstartDocument()throwsSAXException { super.startDocument(); } @Override publicvoidendDocument()throwsSAXException { super.endDocument(); } @Override publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException { if(qName.equals("province")) { provinceModel=newProvinceModel(); provinceModel.setName(attributes.getValue(0)); provinceModel.setCityList(newArrayList ()); } elseif(qName.equals("city")) { cityModel=newCityModel(); cityModel.setName(attributes.getValue(0)); cityModel.setDistrictList(newArrayList ()); } elseif(qName.equals("district")) { districtModel=newDistrictModel(); districtModel.setName(attributes.getValue(0)); districtModel.setZipcode(attributes.getValue(1)); } } @Override publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException { if(qName.equals("district")) { cityModel.getDistrictList().add(districtModel); } elseif(qName.equals("city")) { provinceModel.getCityList().add(cityModel); } elseif(qName.equals("province")) { provinceList.add(provinceModel); } } @Override publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException { super.characters(ch,start,length); } }
publicclassAddressAddActivityextendsBaseActivity { privateOptionsPickerViewmCityPickerView; privateArrayListmProvinces=newArrayList<>(); privateArrayList >mCities=newArrayList<>(); privateArrayList >>mDistricts=newArrayList<>(); @Override protectedvoidonCreate(@NullableBundlesavedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_address_add); ViewUtils.inject(this); init(); } privatevoidinit() { initProvinceDatas(); try { //选项选择器 mCityPickerView=newOptionsPickerView(this); mCityPickerView.setPicker(mProvinces,mCities,mDistricts,true); mCityPickerView.setTitle("选择城市"); mCityPickerView.setCyclic(false,false,false); mCityPickerView.setOnoptionsSelectListener(newOptionsPickerView.OnOptionsSelectListener(){ @Override publicvoidonOptionsSelect(intoptions1,intoption2,intoptions3) { Stringaddress=mProvinces.get(options1).getName()+"" +mCities.get(options1).get(option2)+"" +mDistricts.get(options1).get(option2).get(options3); mTxtAddress.setText(address); } }); } catch(Exceptione) { e.printStackTrace(); } } @OnClick(R.id.ll_city_picker) publicvoidshowpickerView(Viewview) { mCityPickerView.show(); } protectedvoidinitProvinceDatas() { AssetManagerasset=getAssets(); try { InputStreaminput=asset.open("province_data.xml"); SAXParserFactoryspf=SAXParserFactory.newInstance(); SAXParserparser=spf.newSAXParser(); XmlParserHandlerhandler=newXmlParserHandler(); parser.parse(input,handler); input.close(); //获取解析出来的数据 mProvinces=(ArrayList )handler.getDataList(); } catch(Throwablee) { e.printStackTrace(); } if(mProvinces!=null) { for(ProvinceModelp:mProvinces) { List cities=p.getCityList(); //组装城市数据 mCities.add((ArrayList )cities); ArrayList >dts=newArrayList<>(); for(CityModelc:cities) { List districts=c.getDistrictList(); dts.add((ArrayList )districts); } mDistricts.add(dts); } } } }
到此完毕,很简单的例子。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。