Android 中实现省市区的联动,在收货地址选择中用到
来源:互联网 发布:c语言求1000以内素数 编辑:程序博客网 时间:2024/05/17 17:57
实现省市区的联动有两步:
0:第一步解析XML文件得到省的列表,当然了之前还需要创建省,市,区的实体类
使用Pull解析的时候,在START_TAG里面进行初始化,在END_TAG里面进行添加和重新赋值为null,
还有要注意的是最底层的节点<d> 在END_TAG里面是获取不到的,需要在START_TAG里面来进行添加和重新复制为null
1:第二步添加3个Spinner,代表省,市,区,然后实现通过省的选择控制市的显示,然后通过市的选择控制区的显示。就是给省,市添加setOnItemSelectedListener的监听方法,然后在回调中更新spinner 的数据,然后更新显示。
代码:Android 中省市区的联动
xml文件在代码里面的res-〉raw 文件夹里面
主体的代码:
package tech.androidstudio.provincecitydistrictdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.Spinner;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Properties;import tech.androidstudio.provincecitydistrictdemo.entity.City;import tech.androidstudio.provincecitydistrictdemo.entity.District;import tech.androidstudio.provincecitydistrictdemo.entity.Province;public class MainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener { Spinner province_spinner; Spinner city_spinner; Spinner district_spinner; ArrayList<String> province_list; ArrayList<String> city_list; ArrayList<String> district_list; private ArrayList<Province> mProvinceList; private ArrayAdapter<String> province_adapter; private ArrayAdapter<String> city_adapter; private ArrayAdapter<String> district_adapter; //下面的两个参数用来标记选择的是哪一个省和城市,其实可以不用cityNumber的 private int provinceNumber;// private int cityNumber; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); try { mProvinceList = getList(); Log.d("Kodulf", "list " + mProvinceList.toString()); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //初始化 province 省 province_spinner =(Spinner)findViewById(R.id.spinner_province); province_list= new ArrayList<String>(); for(int i=0;i<mProvinceList.size();i++){ province_list.add(mProvinceList.get(i).getProvinceName()); } province_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,province_list); province_spinner.setAdapter(province_adapter); //初始化 city 城市 city_spinner =(Spinner)findViewById(R.id.spinner_city); city_list= new ArrayList<String>(); for(int i=0;i<mProvinceList.get(0).getCityList().size();i++){ city_list.add(mProvinceList.get(0).getCityList().get(i).getCityName()); } city_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,city_list); city_spinner.setAdapter(city_adapter); //初始化 district 区 district_spinner =(Spinner)findViewById(R.id.spinner_district); district_list= new ArrayList<String>(); for(int i=0;i<mProvinceList.get(0).getCityList().get(0).getDistrictList().size();i++){ district_list.add(mProvinceList.get(0).getCityList().get(0).getDistrictList().get(i).getDistrictName()); } district_adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,district_list); district_spinner.setAdapter(district_adapter); //然后给province和city 添加监听器,distrcit 就不需要了, //TODO 注意了,如果这个Spinner 里面只有一个数据,例如北京的 city 只有北京,那么是不会出发onItemSelecte的的事件的 province_spinner.setOnItemSelectedListener(this); city_spinner.setOnItemSelectedListener(this); //district_spinner.setOnItemSelectedListener(this); } @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Log.d("Kodulf", "Click " + "parent=" + parent.toString() + " view=" + view.toString() + "position =" + position + " long id=" + id); int spinnerId = parent.getId(); switch (spinnerId){ case R.id.spinner_province: Log.d("Kodulf", "Province"); //选择省以后,开始更新市的列表,并且设置provinceNumber的值 provinceNumber=position; city_list.clear(); for (int i=0;i<mProvinceList.get(position).getCityList().size();i++){ city_list.add(mProvinceList.get(position).getCityList().get(i).getCityName()); } city_adapter.notifyDataSetChanged(); //同时更新区,获取这个省的第一个市的信息,然后更新。 district_list.clear(); for (int i = 0; i < mProvinceList.get(position).getCityList().get(0).getDistrictList().size(); i++) { district_list.add(mProvinceList.get(position).getCityList().get(0).getDistrictList().get(i).getDistrictName()); } district_adapter.notifyDataSetChanged(); break; case R.id.spinner_city: Log.d("Kodulf", "City"); //选择市以后,开始更新区的列表,可以设置或者不设置cityNumber=position; district_list.clear(); for (int i = 0; i < mProvinceList.get(provinceNumber).getCityList().get(position).getDistrictList().size(); i++) { district_list.add(mProvinceList.get(provinceNumber).getCityList().get(position).getDistrictList().get(i).getDistrictName()); } district_adapter.notifyDataSetChanged(); break; case R.id.spinner_district: Log.d("Kodulf", "District"); break; } } @Override public void onNothingSelected(AdapterView<?> parent) { }//Pull解析XML文件。
public ArrayList<Province> getList() throws XmlPullParserException, IOException { ArrayList<Province> provinceList= new ArrayList<Province>(); Province province=null; ArrayList<City> cityList=null; City city=null; ArrayList<District> districtList=null; District district = null; //使用Pull解析 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xmlPullParser = factory.newPullParser(); //文件 在Raw文件夹里面 InputStream inputStream = getResources().openRawResource(R.raw.citys_weather); xmlPullParser.setInput(inputStream, "utf-8"); //开始解析 int eventType = xmlPullParser.getEventType(); while (eventType!=XmlPullParser.END_DOCUMENT){ switch (eventType){ case XmlPullParser.START_DOCUMENT: Log.d("Kodulf","Start Document"); break; case XmlPullParser.START_TAG: String nodeName = xmlPullParser.getName(); if("p".equals(nodeName)){ province= new Province(); cityList= new ArrayList<City>();//创建Province 的时候就要创建 这个CityList// <p p_id = "01">// <pn>北京</pn> int attributeCount = xmlPullParser.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { String attributeName = xmlPullParser.getAttributeName(i); if("p_id".equals(attributeName)) province.setProvinceId(xmlPullParser.getAttributeValue(i)); } }else if("pn".equals(nodeName)){ String provinceName = xmlPullParser.nextText(); if(provinceName!=null){ province.setProvinceName(provinceName); } }else if("c".equals(nodeName)){ //<c c_id="0101">// <cn>北京</cn> city = new City(); districtList = new ArrayList<District>();//这个不能少。 int attributeCount = xmlPullParser.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { String attributeName = xmlPullParser.getAttributeName(i); if("c_id".equals(attributeName)) city.setCityId(xmlPullParser.getAttributeValue(i)); } }else if("cn".equals(nodeName)){ String cityName = xmlPullParser.nextText(); if(cityName!=null){ city.setCityName(cityName); } }else if("d".equals(nodeName)){ //<d d_id="101010101">北京</d> district = new District(); int attributeCount = xmlPullParser.getAttributeCount(); for (int i = 0; i < attributeCount; i++) { String attributeName = xmlPullParser.getAttributeName(i); if("d_id".equals(attributeName)) district.setDistrictId(xmlPullParser.getAttributeValue(i)); } String districtName = xmlPullParser.nextText(); if(districtName!=null) district.setDistrictName(districtName); //在这里直接添加 districtList.add(district); district=null; } break; case XmlPullParser.END_TAG: String nodeNameEnd = xmlPullParser.getName(); //TODO 怎么没有检测到 d呢? if("d".equals(nodeNameEnd)){ Log.d("Kodulf","nodeNameEnd="+nodeNameEnd+" "+district.toString()); }else if("c".equals(nodeNameEnd)){ city.setDistrictList(districtList); cityList.add(city); city =null; }else if("p".equals(nodeNameEnd)){ province.setCityList(cityList); provinceList.add(province); province=null; } break; } eventType=xmlPullParser.next(); } return provinceList; }}
0 1
- Android 中实现省市区的联动,在收货地址选择中用到
- Android项目中省市区联动的实现
- Android 地址选择器,实现省市区三级联动
- Android 地址选择器,实现省市区三级联动
- Android 仿淘宝收货地址的选择
- android 省市区选择三级联动
- Android省市区三级联动的实现
- Android中使用开源框架citypickerview实现省市区三级联动选择
- Android中使用开源框架citypickerview实现省市区三级联动选择
- Android中使用开源框架Citypickerview实现省市区三级联动选择
- android注册用户地址实现省市区下拉框联动
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- Android省市区三级联动滚轮选择(真实项目中提取出来的组件)
- ssdc_2016架构专场准备(一)
- C语言实现并发查找
- 蓝桥杯之最简单的分治法-----数字旋转方阵
- UVa 10976 Fractions Again?
- 1085. Perfect Sequence (25)【二分查找】——PAT (Advanced Level) Practise
- Android 中实现省市区的联动,在收货地址选择中用到
- 矩阵乘法
- 1086. Tree Traversals Again (25)【二叉树】——PAT (Advanced Level) Practise
- Swift柯里化(Currying)
- android_设备管理员
- Sublime Text3 C++ 设置
- 用jquery实现Tab切换菜单
- MentoCarlo算法求PI值_Java实现
- CSS3的使用