GitHub有一个开源控件PickerView,可以实现三级联动的效果。虽然该控件使用非常简单,但是填充数据异常繁琐。GitHub上的Demo在填充数据的时候是一条一条地填充的,代码过于冗余。下面提供一种简便的方式来实现。
(1)在app目录下新建一个assets文件夹,将province_data.xml文件复制到该文件夹下,该XML文件里保存了全国的省市县的地址数据。
(2)使用SAX解析xml文件中的数据,并将数据填充到PickerView这个控件中。
—ProvinceModel—
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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—
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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—
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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—
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
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); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
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); } } } } |
到此完毕,很简单的例子。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_33022345/article/details/53053767