Android实现城市选择三级联动

yizhihongxing

Android实现城市选择三级联动攻略

在Android开发中,有时会需要实现城市选择功能,而且还需要支持三级联动,即选择省份后展示该省份下的市区列表,选择城市后展示该城市下的县区列表。这里提供一份Android实现城市选择三级联动的攻略。

一、搭建数据源

实现城市选择三级联动首先需要有一个完整的城市数据源,可以采用第三方库提供的数据,也可以自己搭建。以下是自己搭建数据源的示例代码:

// Province.java省份实体类
public class Province {
    public String name; // 省名称
    public List<City> cities; // 省下的城市列表

    public Province(String name, List<City> cities) {
        this.name = name;
        this.cities = cities;
    }
}

// City.java城市实体类
public class City {
    public String name; // 城市名称
    public List<County> counties; // 城市下的县区列表

    public City(String name, List<County> counties) {
        this.name = name;
        this.counties = counties;
    }
}

// County.java县区实体类
public class County {
    public String name; // 县区名称

    public County(String name) {
        this.name = name;
    }
}

// 初始化数据源
List<Province> provinceList = new ArrayList<>();
List<City> cities1 = new ArrayList<>();
cities1.add(new City("杭州", Arrays.asList(new County("滨江"), new County("拱墅"))));
cities1.add(new City("宁波", Arrays.asList(new County("海曙"), new County("江北"))));
provinceList.add(new Province("浙江", cities1));

List<City> cities2 = new ArrayList<>();
cities2.add(new City("北京", Arrays.asList(new County("东城"), new County("西城"), new County("朝阳"))));
cities2.add(new City("天津", Arrays.asList(new County("和平"), new County("河北"))));
provinceList.add(new Province("北京", cities2));

二、实现三级联动选择功能

第二步需要实现以下功能:

  1. 展示省份列表

  2. 选择省份后展示该省份下的城市列表

  3. 选择城市后展示该城市下的县区列表

以下是示例代码:

// CityPickerActivity.java城市选择界面
public class CityPickerActivity extends AppCompatActivity {
    private List<Province> provinceList; // 省份数据源
    private String[] pArray, cArray, coArray; // 省、市、县区列表
    private int pIndex, cIndex, coIndex; // 省、市、县区选中索引

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_city_picker);
        // 初始化数据源
        provinceList = initData();
        initViews();
    }

    // 初始化数据源
    private List<Province> initData() {
        // 省、市、县区数据源初始化代码(同上述代码)
    }

    // 初始化视图
    private void initViews() {
        // 省份选择器
        final NumberPicker provincePicker = findViewById(R.id.province_picker);
        pArray = new String[provinceList.size()];
        for (int i = 0; i < provinceList.size(); i++) {
            pArray[i] = provinceList.get(i).name;
        }
        provincePicker.setMinValue(0);
        provincePicker.setMaxValue(pArray.length - 1);
        provincePicker.setDisplayedValues(pArray);
        provincePicker.setWrapSelectorWheel(false);
        provincePicker.setOnValueChangedListener((picker, oldVal, newVal) -> {
            pIndex = newVal;
            // 切换省份后更新市的数据源和界面
            cIndex = 0;
            coIndex = 0;
            CityPickerAdapter adapter = (CityPickerAdapter) cityPicker.getAdapter();
            adapter.update(provinceList.get(pIndex).cities);
            countyPicker.setAdapter(new CountyPickerAdapter(provinceList.get(pIndex).cities.get(0).counties));
        });

        // 城市选择器
        final NumberPicker cityPicker = findViewById(R.id.city_picker);
        String[] cArray = new String[provinceList.get(0).cities.size()];
        for (int i = 0; i < provinceList.get(0).cities.size(); i++) {
            cArray[i] = provinceList.get(0).cities.get(i).name;
        }
        cityPicker.setMinValue(0);
        cityPicker.setMaxValue(cArray.length - 1);
        cityPicker.setDisplayedValues(cArray);
        cityPicker.setWrapSelectorWheel(false);
        cityPicker.setOnValueChangedListener((picker, oldVal, newVal) -> {
            cIndex = newVal;
            // 切换城市后更新县区的数据源和界面
            coIndex = 0;
            CountyPickerAdapter adapter = (CountyPickerAdapter) countyPicker.getAdapter();
            adapter.update(provinceList.get(pIndex).cities.get(cIndex).counties);
        });

        // 县区选择器
        final NumberPicker countyPicker = findViewById(R.id.county_picker);
        String[] coArray = new String[provinceList.get(0).cities.get(0).counties.size()];
        for (int i = 0; i < provinceList.get(0).cities.get(0).counties.size(); i++) {
            coArray[i] = provinceList.get(0).cities.get(0).counties.get(i).name;
        }
        countyPicker.setMinValue(0);
        countyPicker.setMaxValue(coArray.length - 1);
        countyPicker.setDisplayedValues(coArray);
        countyPicker.setWrapSelectorWheel(false);
        countyPicker.setOnValueChangedListener((picker, oldVal, newVal) -> {
            coIndex = newVal;
        });
}

以上代码是以NumberPicker为例,其他控件选择方式类似。

三、获取选择结果

最后一步需要获取选择的结果,可能需要使用SharedPreferences、回调函数等方法返回结果,这里只提供SharedPreferences存储选择结果的示例代码:

// 选择结果存储方法
private void storeResult() {
    SharedPreferences sp = getSharedPreferences("city", MODE_PRIVATE);
    SharedPreferences.Editor editor = sp.edit();
    editor.putString("province", pArray[pIndex]);
    editor.putString("city", cArray[cIndex]);
    editor.putString("county", coArray[coIndex]);
    editor.apply();
}

// 获取选择结果方法
private String getResult() {
    SharedPreferences sp = getSharedPreferences("city", MODE_PRIVATE);
    String province = sp.getString("province", "");
    String city = sp.getString("city", "");
    String county = sp.getString("county", "");
    return province + " - " + city + " - " + county;
}

以上就是Android实现城市选择三级联动的攻略,通过自己搭建数据源并使用NumberPicker作为选择控件,最后可以通过SharedPreferences存储选择结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android实现城市选择三级联动 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • IOS-MVC层读取服务器接口JSON数据

    首先,在IOS中采用MVC设计模式可以有效地解耦、优化代码结构以及方便代码管理。在读取服务器接口JSON数据时,我们可以采用以下步骤: 创建一个Model类:定义与服务器端数据对应的模型,一般以属性的形式表示。 @interface User : NSObject @property (nonatomic, strong) NSString *name; @…

    C 2023年5月23日
    00
  • OpenCV实现图像连通域

    下面是OpenCV实现图像连通域的完整攻略: 1. 简介 图像连通域是指一组具有相同像素值的像素的集合。在图像分割、形状识别等领域中,这是一个非常重要的概念。OpenCV提供了一些方法来计算图像中不同的连通域。在这篇文章中,我将向你展示如何用OpenCV实现图像连通域。 2. 实现步骤 OpenCV通过扫描整个图像,检测相邻像素值相同的像素,将这些像素标记为…

    C 2023年5月23日
    00
  • 打包非 JavaScript 静态资源详情

    打包非 JavaScript 静态资源是前端项目构建过程中不可或缺的一环。通过打包,可以减少静态资源的大小、优化网络请求和加速页面加载速度。 下面是打包非 JavaScript 静态资源的完整攻略: 确定需要打包的静态资源类型 在进行打包操作之前,我们需要明确需要打包的静态资源的类型。主要包括:图片、样式、字体等。 安装所需的工具 通常我们使用 webpac…

    C 2023年5月23日
    00
  • windows无法访问指定设备路径或文件详细解决方案

    Windows无法访问指定设备路径或文件详细解决方案 在使用Windows电脑时,我们有时可能会遇到“Windows无法访问指定设备路径或文件”这样的错误提示,这通常是由于一些权限或路径错误引起的。本文将介绍一些可行的解决方案。 方案一:检查文件或路径权限 这种错误通常是由于您缺少对文件或路径的访问权限导致的,因此您需要检查并更改相关权限设置,如下所示: 右…

    C 2023年5月24日
    00
  • c++11封装thread库的方法示例

    C++11封装thread库的方法示例 本文讲解在C++11中如何使用thread库进行线程管理,通过封装实现线程安全的应用程序。 为什么要使用线程 在计算机科学中,线程表示程序中执行的一条路径。一个进程通常包含一个或多个线程,多个线程可以并行执行,提高程序的处理效率;同时,也方便了对于程序中复杂、耗时的操作的调度和管理。 介绍封装thread库的方法 C+…

    C 2023年5月22日
    00
  • C语言源码实现停车场管理系统

    C语言源码实现停车场管理系统 介绍 停车场管理系统是一个常见的管理系统,可用于实现停车场入场、出场的车辆管理及计费功能。这个系统可以通过编程语言实现。C语言是一门广泛应用于工业界、应用界和学术界的计算机编程语言,在实现停车场管理系统方面也有良好的表现。 实现步骤 下面是一个简单的实现停车场管理系统的步骤: 1. 创建一个车辆结构体 创建一个车辆结构体并在其中…

    C 2023年5月30日
    00
  • C语言指针基础知识实例讲解

    下面我就来详细讲解一下“C语言指针基础知识实例讲解”的完整攻略。 知识点概述 首先,我们需要了解一下指针是什么。指针是一个变量,其值为另一个变量的地址。换句话说,指针是一种存储另一个变量地址的变量。在C语言中,指针的数据类型在其前面加上*号。 我们还需要知道如何声明和初始化指针。指针的声明与其他变量类似,只需在变量名前面加上*号。例如,int *p表示p是一…

    C 2023年5月23日
    00
  • c++关键字const的用法详解

    下面就是对“c++关键字const的用法详解”的完整攻略。 什么是const const 是 C++ 中的一个关键字,用来定义常量。在 C++ 中,常量是指不能被修改的值。 const的用法 1. 修饰变量 const 可以用来定义一个常量变量,被 const 修饰的变量一旦被初始化,就不能被修改。 示例代码: const int a = 10; 2. 修饰…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部