Android实现城市选择三级联动

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日

相关文章

  • notepad介绍及插件cmake编译过程(替代notepad++)

    Notepad介绍 Notepad是一款Windows平台下的简洁文本编辑器,其主要功能包括查看、编辑纯文本文档,具有简单、易上手、快速启动等特点,在Windows操作系统服务管理、配置文件编辑、读写脚本等工作中得到了广泛的应用。 插件CMake编译过程 Notepad++是Notepad的增强版,其功能更为强大,支持丰富的插件,其中之一就是CMake,它能…

    C 2023年5月23日
    00
  • SpringBoot实现全局异常处理方法总结

    针对“SpringBoot实现全局异常处理方法总结”的完整攻略,我可以给出以下详细说明: 1. 异常处理简述 在 Spring Boot 应用中,当出现异常时,可以通过全局异常处理机制统一处理异常信息,避免异常信息直接传递到客户端,保证了系统的安全性和可靠性。 2. 实现全局异常处理 2.1 创建全局异常处理类 在 Spring Boot 项目中,我们可以通…

    C 2023年5月23日
    00
  • C语言实现2048游戏代码

    C语言实现2048游戏代码攻略 一、项目背景 2048游戏是一款非常经典且受欢迎的益智类游戏,目前已经在各个平台上得到广泛的应用。实现2048游戏的过程既可以锻炼编程基础功底,还能提高逻辑思维能力。因此,本项目旨在利用C语言实现2048游戏代码,供初学者参考与学习。 二、实现步骤 1. 初始化棋盘 首先,我们需要在C语言中创建一个数组,并将所有元素初始化为0…

    C 2023年5月23日
    00
  • 金士顿DT70怎么样 金士顿DT70USB-C闪存盘评测

    金士顿DT70USB-C闪存盘评测攻略 一、产品介绍 金士顿DT70USB-C闪存盘是一款最新推出的USB-C闪存盘,容量覆盖32GB、64GB和128GB三种。具有高速读写、持久耐用和多平台通用等特点,可广泛应用于PC、手机、平板、电视等设备中。 二、技术规格 规格 描述 存储容量 32GB/64GB/128GB 接口类型 USB-C 读取速度 最高可达2…

    C 2023年5月23日
    00
  • C语言实现页面置换算法(FIFO、LRU)

    C语言实现页面置换算法 在操作系统中,进程访问内存时,若访问的物理页不在内存中,就会出现缺页调度现象。为了解决这个问题,就需要使用页面置换算法。常用的页面置换算法包括FIFO和LRU,下面将详细讲解如何用C语言实现这两种算法。 一、使用FIFO算法实现页面置换 FIFO算法是一种最简单的内存置换算法,它是根据页面装入内存的时间先后次序决定淘汰的页面。先进先出…

    C 2023年5月22日
    00
  • C++实现地铁自动售票系统程序设计

    C++实现地铁自动售票系统程序设计攻略 概述 地铁自动售票系统是一种基于计算机技术的智能化自助售票系统,可以方便快捷地为乘客提供地铁车票的购买、充值、查询、退款等服务。本文主要介绍如何使用C++语言实现地铁自动售票系统的设计以及开发方法。 实现步骤 第一步:确定功能需求 地铁自动售票系统的主要功能包括: 售卖地铁票和充值。要求用户输入选择的地铁线路和数量,然…

    C 2023年5月23日
    00
  • 易语言通过“打开”命令操作数据库

    下面是易语言通过“打开”命令操作数据库的完整攻略。 1. 设置数据库连接字符串 在使用打开命令连接数据库之前,我们需要先设置数据库连接字符串,用于连接目标数据库。可参考下面的代码示例进行设置: ‘ 使用ADO连接MySQL数据库 数据库类型常量 定义值:sql_mysql 数据库名称常量 定义值:"testdb" 服务器名称常量 定义值:…

    C 2023年5月22日
    00
  • c++中nlohmann json的基本使用教程

    C++中nlohmann json的基本使用教程 简介 nlohmann json是一个开源的JSON解析器和生成器,支持标准的JSON格式。它是一个单头文件的库,可以轻松地集成到C++项目中。 安装 使用nlohmann json不需要安装,只需要将头文件json.hpp复制到你的项目中即可。 基本使用 创建一个JSON对象 #include "…

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