Android PickerView实现三级联动效果

发布时间:2019-08-08 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了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<CityModel> cityList;    public ProvinceModel()   {     suPEr();   }    public String getName()   {     return name;   }    public void setName(String name)   {     this.name = name;   }    public List<CityModel> getCityList()   {     return cityList;   }    public void setCityList(List<CityModel> cityList)   {     this.cityList = cityList;   }    @override   public String getPickerViewText()   {     return name;   } }

―CityModel―

 public class CityModel implements IPickerViewData {   private String name;   private List<DistrictModel> districtList;    public CityModel()   {     super();   }    public String getName()   {     return name;   }    public void setName(String name)   {     this.name = name;   }    public List<DistrictModel> getDistrictList()   {     return districtList;   }    public void setDistrictList(List<DistrictModel> 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<ProvinceModel> provinceList = new ArrayList<>();   private ProvinceModel provinceModel = new ProvinceModel();   private CityModel cityModel = new CityModel();   private DistrictModel districtModel = new DistrictModel();    public XmlParserHandler(){}    public List<ProvinceModel> 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<CityModel>());     }     else if (qName.equals("city"))     {       cityModel = new CityModel();       cityModel.setName(attributes.getValue(0));       cityModel.setDistrictList(new ArrayList<DistrictModel>());     }     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<ProvinceModel> mProvinces = new ArrayList<>();   private ArrayList<ArrayList<CityModel>> mCities = new ArrayList<>();   private ArrayList<ArrayList<ArrayList<DistrictModel>>> 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<ProvinceModel>) handler.getDataList();     }     catch (Throwable e)     {       e.printStackTrace();     }      if (mProvinces != null)     {       for (ProvinceModel p : mProvinces)       {         List<CityModel> cities = p.getCityList();         //组装城市数据         mCities.add((ArrayList<CityModel>) cities);         ArrayList<ArrayList<DistrictModel>> dts = new ArrayList<>();         for (CityModel c : cities)         {           List<DistrictModel> districts = c.getDistrictList();           dts.add((ArrayList<DistrictModel>) districts);         }         mDistricts.add(dts);       }     }   } }

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

android教程
脚本网站
android studio

脚本宝典总结

以上是脚本宝典为你收集整理的Android PickerView实现三级联动效果全部内容,希望文章能够帮你解决Android PickerView实现三级联动效果所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。