项目源码地址:https://fengsourcecode.googlecode.com/svn/trunk/ProvinceAndCity
1.首先是bean 省的
/**
* @(#) Province.java Created on 2012-6-13
*
* Copyright (c) 2012 Aspire. All Rights Reserved
*/
package com.android.test.provinceandcity.bean;
import java.util.List;
/**
* The class <code>Province</code>
*
* @author ouyangfeng
* @version 1.0
*/
public class Province {
/**
* province name
*/
private String name;
/**
* province code
*/
private int code;
/**
* province have cities
*/
private List<City> cities;
public Province(String name, int code) {
super();
this.name = name;
this.code = code;
}
public Province(String name, int code, List<City> cities) {
super();
this.name = name;
this.code = code;
this.cities = cities;
}
/**
* Getter of name
*
* @return the name
*/
public String getName() {
return name;
}
/**
* Setter of name
*
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* Getter of code
*
* @return the code
*/
public int getCode() {
return code;
}
/**
* Setter of code
*
* @param code
* the code to set
*/
public void setCode(int code) {
this.code = code;
}
/**
* Getter of cities
*
* @return the cities
*/
public List<City> getCities() {
return cities;
}
/**
* Setter of cities
*
* @param cities
* the cities to set
*/
public void setCities(List<City> cities) {
this.cities = cities;
}
/**
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return name;
}
}
然后是市的
/**
* @(#) City.java Created on 2012-6-13
*
* Copyright (c) 2012 Aspire. All Rights Reserved
*/
package com.android.test.provinceandcity.bean;
/**
* The class <code>City</code>
*
* @author ouyangfeng
* @version 1.0
*/
public class City {
/**
* city name
*/
private String name;
/**
* province code;
*/
private int province_code;
/**
* city code
*/
private int code;
/**
* city unique code
*/
private int unique_code;
public City(String name, int province_code, int code, int unique_code) {
super();
this.name = name;
this.province_code = province_code;
this.code = code;
this.unique_code = unique_code;
}
/**
* Getter of name
*
* @return the name
*/
public String getName() {
return name;
}
/**
* Setter of name
*
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* Getter of province_code
*
* @return the province_code
*/
public int getProvince_code() {
return province_code;
}
/**
* Setter of province_code
*
* @param province_code
* the province_code to set
*/
public void setProvince_code(int province_code) {
this.province_code = province_code;
}
/**
* Getter of code
*
* @return the code
*/
public int getCode() {
return code;
}
/**
* Setter of code
*
* @param code
* the code to set
*/
public void setCode(int code) {
this.code = code;
}
/**
* Getter of unique_code
*
* @return the unique_code
*/
public int getUnique_code() {
return unique_code;
}
/**
* Setter of unique_code
*
* @param unique_code
* the unique_code to set
*/
public void setUnique_code(int unique_code) {
this.unique_code = unique_code;
}
/**
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return name;
}
}
然后是关于数据解析的
/**
* @(#) ProvinceParse.java Created on 2012-6-13
*
* Copyright (c) 2012 Aspire. All Rights Reserved
*/
package com.android.test.provinceandcity.parse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import com.android.test.provinceandcity.bean.City;
import com.android.test.provinceandcity.bean.Province;
/**
* The class <code>ProvinceParse</code>
*
* @author ouyangfeng
* @version 1.0
*/
public class ProvinceParse {
private static final String SPLIT_REGEX = ",";
private Context mContext;
private int province_id;
private int cities_id;
private List<Province> provinces;
private ProvinceParse() {
}
public static ProvinceParse build(Context mContext, int province_id, int cities_id) {
final ProvinceParse parse = new ProvinceParse();
parse.mContext = mContext;
parse.province_id = province_id;
parse.cities_id = cities_id;
parse.parse();
return parse;
}
/**
* parse from file
*/
private void parse() {
try {
parseProvince();
final List<City> cities = parseCity();
List<City> tempCities = null;
for (Province province : provinces) {
tempCities = new ArrayList<City>();
for (City city : cities) {
if (city.getProvince_code() == province.getCode()) {
tempCities.add(city);
}
}
province.setCities(tempCities);
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
private void parseProvince() throws IOException {
final List<String> strings = readLine(mContext, province_id);
provinces = new ArrayList<Province>();
Province province = null;
String[] splitstr = null;
for (String str : strings) {
splitstr = splitLine(str, SPLIT_REGEX);
if (splitstr.length == 2) {
province = new Province(splitstr[0], Integer.parseInt(splitstr[1]));
provinces.add(province);
}
}
}
private List<City> parseCity() throws IOException {
final List<String> strings = readLine(mContext, cities_id);
final List<City> cities = new ArrayList<City>();
City city = null;
String[] splitstr = null;
for (String str : strings) {
splitstr = splitLine(str, SPLIT_REGEX);
if (splitstr.length == 4) {
city = new City(splitstr[1], Integer.parseInt(splitstr[0]), Integer.parseInt(splitstr[2]),
Integer.parseInt(splitstr[3]));
cities.add(city);
}
}
return cities;
}
/**
* Getter of provinces
*
* @return the provinces
*/
public List<Province> getProvinces() {
return provinces;
}
private static String[] splitLine(String str, String regex) {
return str.split(regex);
}
/**
* read file by read line
*
* @param mContext
* @param id
* @return
* @throws IOException
*/
private static List<String> readLine(Context mContext, int id) throws IOException {
final InputStream in = mContext.getResources().openRawResource(id);
final BufferedReader reader = new BufferedReader(new InputStreamReader(in, "GBK"));
final List<String> strings = new ArrayList<String>();
String line = null;
while (null != (line = reader.readLine())) {
strings.add(line);
}
reader.close();
return strings;
}
}
最后activity的
package com.android.test.provinceandcity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import com.android.test.provinceandcity.bean.City;
import com.android.test.provinceandcity.bean.Province;
import com.android.test.provinceandcity.parse.ProvinceParse;
public class ProvinceActivity extends Activity implements OnClickListener {
private ProvinceParse parse;
private Spinner spinner1, spinner2;
private Province currentProvince;
private City currentCity;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
/**
*
*/
private void init() {
parse = ProvinceParse.build(this, R.raw.province, R.raw.cities);
spinner1 = (Spinner) findViewById(R.id.spinner1);
spinner2 = (Spinner) findViewById(R.id.spinner2);
findViewById(R.id.button1).setOnClickListener(this);
ArrayAdapter<Province> provinceAdapter = new ArrayAdapter<Province>(this, R.layout.simple_spinner_item,
android.R.id.text1, parse.getProvinces());
spinner1.setAdapter(provinceAdapter);
spinner1.setOnItemSelectedListener(new ProvinceAdapter());
spinner2.setOnItemSelectedListener(new CityAdapter());
}
public void onProvinChange(int position) {
currentProvince = parse.getProvinces().get(position);
ArrayAdapter<City> cityAdapter = new ArrayAdapter<City>(this, R.layout.simple_spinner_item, android.R.id.text1,
currentProvince.getCities());
spinner2.setAdapter(cityAdapter);
}
class ProvinceAdapter implements OnItemSelectedListener {
/**
* (non-Javadoc)
*
* @see android.widget.AdapterView.OnItemSelectedListener#onItemSelected(android.widget.AdapterView,
* android.view.View, int, long)
*/
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
onProvinChange(position);
}
/**
* (non-Javadoc)
*
* @see android.widget.AdapterView.OnItemSelectedListener#onNothingSelected(android.widget.AdapterView)
*/
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
final class CityAdapter extends ProvinceAdapter {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
currentCity = currentProvince.getCities().get(position);
}
}
/**
* (non-Javadoc)
*
* @see android.view.View.OnClickListener#onClick(android.view.View)
*/
@Override
public void onClick(View v) {
Toast.makeText(this, "" + currentProvince + currentCity, Toast.LENGTH_SHORT).show();
}
}
两个xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Spinner
android:id="@+id/spinner1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Spinner
android:id="@+id/spinner2"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/button1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<!--
/* //device/apps/common/assets/res/any/layout/simple_spinner_item.xml
**
** Copyright 2006, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
style="?android:attr/spinnerItemStyle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:singleLine="true"
android:textSize="15pt" />
分享到:
相关推荐
【安卓 Spinner 实现省市级联】是Android开发中常见的需求,用于在应用程序中创建一个下拉选择组件,展示省、市、区等地理层级的数据。Spinner控件在Android中广泛用于实现有限选项的选择,通常与Adapter配合使用,...
在Android应用开发中,"spinner"控件常用于创建下拉选择列表,它提供了一种简洁的方式让用户在有限的选项中进行选择。本教程将详细讲解如何实现“省市区联动”功能,即用户选择省份后,市的选择会相应更新,进一步...
例如,当用户在省的Spinner中选择一个省份后,市的Spinner应该根据该省份加载对应的市级数据;同样,市选择后,区的Spinner则加载对应的区级数据。 为了实现这种动态加载,我们需要准备三个数据结构,如ArrayList或...
本示例“spinner二级省市级联”是针对如何使用Spinner实现省市区三级联动的一个经典应用场景。在这个项目中,我们将会看到如何通过编程方式处理这种复杂的交互。 首先,Spinner的使用通常涉及到数据的加载和适配器...
总的来说,"模拟省市级联"是Android开发中的一个实用功能,它涉及到Spinner的使用、数据结构设计、Adapter的定制以及事件监听等多方面知识。通过理解和实践这些知识点,开发者能够更好地掌握Android UI交互的实现...
本案例中,我们探讨的是如何利用Spinner来展示城市信息,具体实现一个两级联动的效果:第一个Spinner显示省级列表,用户选择一个省后,第二个Spinner会动态更新并显示该省对应的市级列表。 首先,我们需要准备省级...
例如,当省份被选中时,更新市级Spinner的数据源,然后调用`spinner.setSelection()`使其显示对应的默认选项。 5. **动态加载数据**:为了提高用户体验,通常会在需要时才加载下一级的数据,而不是一次性加载所有...
在这个示例中,开发者使用了Spinner组件来展示省级、市级和区级的选择项,形成一个联动的效果,即选择一个省后,市的选择项会自动更新,选择一个市后,区的选择项也会相应更新。 Spinner是Android中的一个下拉选择...
"省市级联动Wheel选择器"是一种常见的UI组件,常用于用户需要快速选择省份和城市的情况,如地址输入、配送设置等。这种选择器通常由两个或多个轮盘(Wheel)组成,当用户在上一级(例如省份)做出选择后,下一级...
这需要在省份Spinner的OnItemSelectedListener中实现,根据省份ID查找对应的市级数据,并更新市级Spinner的Adapter。 7. **简洁易懂**:该项目的标签为"简洁,易懂",这意味着代码应该有良好的可读性和组织性。代码...
在Android中,我们通常会创建一个包含省级数据的列表,每个省下面又有对应的市级数据列表,同理,每个市下再包含区级数据列表。这样的数据结构可以采用多层嵌套的列表或者使用树形结构来表示。在本项目中,数据可能...
这个"Android源码——省市区三级连动--spinner.zip"文件提供了一个实现这一功能的示例。在这个项目中,开发者使用了Spinner控件来展示并处理这种层次结构的数据。 Spinner是Android SDK中的一个下拉选择组件,类似...
当用户选择一个省份时,根据省份ID找到对应的市级数据,并将其设置为下一个Spinner的数据源;同理,当选择一个城市时,找到对应的区级数据。这种联动效果需要在适配器的监听事件中实现。 **七、UI设计** 在布局文件...
在Android开发中,"省-市-县"三级联动是一种常见的功能,特别是在地图应用、物流配送、地址选择等场景中。这个功能允许用户按照省级行政区划、市级行政区划和县级行政区划顺序进行选择,形成一个完整的地理位置信息...
"android(三级联动)全国省市县下拉地址选择源码"是一个专门针对Android平台设计的,用于实现中国省级、市级、县级地址选择的开源项目。它包含了全国所有省份、城市和区县的数据,用户可以通过下拉列表依次选择省、市...
在这个项目中,我们通常会为每个级别(省、市、区)创建一个Spinner,并通过监听它们的事件来实现联动。 接着,数据库的选择通常是SQLite,它是Android系统内置的关系型数据库。我们可以创建一个SQLite数据库来存储...
标题“android全国地区选择”指的是一个专为Android设计的解决方案,用于实现用户在应用内选择中国全境的省级、市级和区县级地区。这个解决方案通常会涉及到本地数据存储,以便快速响应用户的操作,减少网络请求。 ...
在Android中,省市联动的基本原理是通过Spinner控件来展示省级和市级的选择列表,并在用户选择某一省后动态加载对应的市。这种功能的关键在于数据的管理和UI的更新。以下将详细介绍涉及的知识点: 1. **Spinner**:...
1. **ListView或RecyclerView**:这是Android中常用的列表控件,用于显示省、市、区县的选项。开发者可能会通过Adapter将数据绑定到这些控件上,实现滚动和点击事件。 2. **数据结构**:为了存储和处理省市区的数据...
- **Spinner/BottomSheetDialog**:为了方便用户选择,可以选择使用Spinner作为下拉菜单,或者使用BottomSheetDialog来提供更丰富的交互体验。 - **搜索功能**:为了提高用户体验,通常会提供搜索框,允许用户输入...