github有一个开源控件pickerview,可以实现三级联动的效果。虽然该控件使用非常简单,但是填充数据异常繁琐。github上的demo在填充数据的时候是一条一条地填充的,代码过于冗余。下面提供一种简便的方式来实现。
(1)在app目录下新建一个assets文件夹,将province_data.xml文件复制到该文件夹下,该xml文件里保存了全国的省市县的地址数据。
(2)使用sax解析xml文件中的数据,并将数据填充到pickerview这个控件中。
—provincemodel—
public class provincemodel implements ipickerviewdata
{
private string name;
private list citylist;
public provincemodel()
{
super();
}
public string getname()
{
return name;
}
public void setname(string name)
{
this.name = name;
}
public list getcitylist()
{
return citylist;
}
public void setcitylist(list citylist)
{
this.citylist = citylist;
}
@override
public string getpickerviewtext()
{
return name;
}
}
—citymodel—
public class citymodel implements ipickerviewdata
{
private string name;
private list districtlist;
public citymodel()
{
super();
}
public string getname()
{
return name;
}
public void setname(string name)
{
this.name = name;
}
public list getdistrictlist()
{
return districtlist;
}
public void setdistrictlist(list 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
{
/**
* 存储所有的解析对象
*/
private list provincelist = new arraylist<>();
private provincemodel provincemodel = new provincemodel();
private citymodel citymodel = new citymodel();
private districtmodel districtmodel = new districtmodel();
public xmlparserhandler(){}
public list 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());
}
else if (qname.equals("city"))
{
citymodel = new citymodel();
citymodel.setname(attributes.getvalue(0));
citymodel.setdistrictlist(new arraylist());
}
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 mprovinces = new arraylist<>();
private arraylist> mcities = new arraylist<>();
private arraylist>> 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
{
//选项选择器
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();
//获取解析出来的数据
mprovinces = (arraylist) handler.getdatalist();
}
catch (throwable e)
{
e.printstacktrace();
}
if (mprovinces != null)
{
for (provincemodel p : mprovinces)
{
list cities = p.getcitylist();
//组装城市数据
mcities.add((arraylist) cities);
arraylist> dts = new arraylist<>();
for (citymodel c : cities)
{
list districts = c.getdistrictlist();
dts.add((arraylist) districts);
}
mdistricts.add(dts);
}
}
}
}
到此完毕,很简单的例子。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。