android pickerview 多行,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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值