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;
}
publicListgetCityList()
{
returncityList;
}
publicvoidsetCityList(ListcityList)
{
this.cityList=cityList;
}
@Override
publicStringgetPickerViewText()
{
returnname;
}
}
—CityModel—
publicclassCityModelimplementsIPickerViewData
{
privateStringname;
privateListdistrictList;
publicCityModel()
{
super();
}
publicStringgetName()
{
returnname;
}
publicvoidsetName(Stringname)
{
this.name=name;
}
publicListgetDistrictList()
{
returndistrictList;
}
publicvoidsetDistrictList(ListdistrictList)
{
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(){}
publicListgetDataList()
{
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)
{
Listcities=p.getCityList();
//组装城市数据
mCities.add((ArrayList)cities);
ArrayList>dts=newArrayList<>();
for(CityModelc:cities)
{
Listdistricts=c.getDistrictList();
dts.add((ArrayList)districts);
}
mDistricts.add(dts);
}
}
}
}
到此完毕,很简单的例子。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。