`
ouyangfeng521
  • 浏览: 248719 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

android spinner 省市级联

 
阅读更多

项目源码地址: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 实现省市级联

    【安卓 Spinner 实现省市级联】是Android开发中常见的需求,用于在应用程序中创建一个下拉选择组件,展示省、市、区等地理层级的数据。Spinner控件在Android中广泛用于实现有限选项的选择,通常与Adapter配合使用,...

    Android spinner 省市联动

    在Android应用开发中,"spinner"控件常用于创建下拉选择列表,它提供了一种简洁的方式让用户在有限的选项中进行选择。本教程将详细讲解如何实现“省市区联动”功能,即用户选择省份后,市的选择会相应更新,进一步...

    android spinner 三级联动

    例如,当用户在省的Spinner中选择一个省份后,市的Spinner应该根据该省份加载对应的市级数据;同样,市选择后,区的Spinner则加载对应的区级数据。 为了实现这种动态加载,我们需要准备三个数据结构,如ArrayList或...

    spinner二级省市级联

    本示例“spinner二级省市级联”是针对如何使用Spinner实现省市区三级联动的一个经典应用场景。在这个项目中,我们将会看到如何通过编程方式处理这种复杂的交互。 首先,Spinner的使用通常涉及到数据的加载和适配器...

    模拟省市级联

    总的来说,"模拟省市级联"是Android开发中的一个实用功能,它涉及到Spinner的使用、数据结构设计、Adapter的定制以及事件监听等多方面知识。通过理解和实践这些知识点,开发者能够更好地掌握Android UI交互的实现...

    Spinner显示城市信息

    本案例中,我们探讨的是如何利用Spinner来展示城市信息,具体实现一个两级联动的效果:第一个Spinner显示省级列表,用户选择一个省后,第二个Spinner会动态更新并显示该省对应的市级列表。 首先,我们需要准备省级...

    安卓三级联动省市联动多级联动相关-Spinner多级联动.zip

    例如,当省份被选中时,更新市级Spinner的数据源,然后调用`spinner.setSelection()`使其显示对应的默认选项。 5. **动态加载数据**:为了提高用户体验,通常会在需要时才加载下一级的数据,而不是一次性加载所有...

    Android 省市区三级连动--spinner.zip

    在这个示例中,开发者使用了Spinner组件来展示省级、市级和区级的选择项,形成一个联动的效果,即选择一个省后,市的选择项会自动更新,选择一个市后,区的选择项也会相应更新。 Spinner是Android中的一个下拉选择...

    省市级联动Wheel选择器

    "省市级联动Wheel选择器"是一种常见的UI组件,常用于用户需要快速选择省份和城市的情况,如地址输入、配送设置等。这种选择器通常由两个或多个轮盘(Wheel)组成,当用户在上一级(例如省份)做出选择后,下一级...

    省市二级spinner

    这需要在省份Spinner的OnItemSelectedListener中实现,根据省份ID查找对应的市级数据,并更新市级Spinner的Adapter。 7. **简洁易懂**:该项目的标签为"简洁,易懂",这意味着代码应该有良好的可读性和组织性。代码...

    Android省,市,区三级联动(含各省市数据)

    在Android中,我们通常会创建一个包含省级数据的列表,每个省下面又有对应的市级数据列表,同理,每个市下再包含区级数据列表。这样的数据结构可以采用多层嵌套的列表或者使用树形结构来表示。在本项目中,数据可能...

    Android源码——省市区三级连动--spinner.zip

    这个"Android源码——省市区三级连动--spinner.zip"文件提供了一个实现这一功能的示例。在这个项目中,开发者使用了Spinner控件来展示并处理这种层次结构的数据。 Spinner是Android SDK中的一个下拉选择组件,类似...

    Android 省市区三级连动--spinner.rar

    当用户选择一个省份时,根据省份ID找到对应的市级数据,并将其设置为下一个Spinner的数据源;同理,当选择一个城市时,找到对应的区级数据。这种联动效果需要在适配器的监听事件中实现。 **七、UI设计** 在布局文件...

    Android 省 市 县 三级联动

    在Android开发中,"省-市-县"三级联动是一种常见的功能,特别是在地图应用、物流配送、地址选择等场景中。这个功能允许用户按照省级行政区划、市级行政区划和县级行政区划顺序进行选择,形成一个完整的地理位置信息...

    android(三级联动)全国省市县下拉地址选择源码

    "android(三级联动)全国省市县下拉地址选择源码"是一个专门针对Android平台设计的,用于实现中国省级、市级、县级地址选择的开源项目。它包含了全国所有省份、城市和区县的数据,用户可以通过下拉列表依次选择省、市...

    android省市区三级联动控件加数据库

    在这个项目中,我们通常会为每个级别(省、市、区)创建一个Spinner,并通过监听它们的事件来实现联动。 接着,数据库的选择通常是SQLite,它是Android系统内置的关系型数据库。我们可以创建一个SQLite数据库来存储...

    android全国地区选择

    标题“android全国地区选择”指的是一个专为Android设计的解决方案,用于实现用户在应用内选择中国全境的省级、市级和区县级地区。这个解决方案通常会涉及到本地数据存储,以便快速响应用户的操作,减少网络请求。 ...

    Android高级应用源码-安卓省市联动.zip

    在Android中,省市联动的基本原理是通过Spinner控件来展示省级和市级的选择列表,并在用户选择某一省后动态加载对应的市。这种功能的关键在于数据的管理和UI的更新。以下将详细介绍涉及的知识点: 1. **Spinner**:...

    android省市区三级联动地址选择器demo

    1. **ListView或RecyclerView**:这是Android中常用的列表控件,用于显示省、市、区县的选项。开发者可能会通过Adapter将数据绑定到这些控件上,实现滚动和点击事件。 2. **数据结构**:为了存储和处理省市区的数据...

    城市选择android工程

    - **Spinner/BottomSheetDialog**:为了方便用户选择,可以选择使用Spinner作为下拉菜单,或者使用BottomSheetDialog来提供更丰富的交互体验。 - **搜索功能**:为了提高用户体验,通常会提供搜索框,允许用户输入...

Global site tag (gtag.js) - Google Analytics