商品三级联动+android,Android PickerView实现三级联动效果

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);

}

}

}

}

到此完毕,很简单的例子。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值