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日

相关文章

  • Json解析的方法小结

    以下是“Json解析的方法小结”的完整攻略: 什么是Json? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它是基于JavaScript的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。在数据交换时,Json更加方便快捷。 Json解析的方法 Json解析的方法有4种,分别是: 1. 基于JSON…

    C 2023年5月23日
    00
  • C++设计与实现ORM系统实例详解

    C++设计与实现ORM系统实例详解 什么是ORM ORM(Object-Relational Mapping)是指对象关系映射,是一种面向对象编程语言与关系型数据库之间的转换技术。ORM系统通过把关系型数据库的表和数据映射成对象,将对象的操作数据的行为映射成SQL语句,从而实现对数据库的操作。ORM系统可以让程序员无需编写SQL语句,就能够使用面向对象的方式…

    C 2023年5月22日
    00
  • C程序 通过创建一个函数来检查素数

    创建一个函数来检查素数是一个常见的C语言编程问题。下面是一个步骤指南和示例示范。 步骤指南 步骤如下: 定义函数的名称和返回类型。由于函数检查一个数字是否为素数,因此我们可以定义函数为 isPrime(),且函数返回类型为 int,因为我们需要返回0或1。 在函数内部定义一个整数 i 用于循环。我们需要从2到输入数字的平方根进行循环,判断输入数字是否能被整除…

    C 2023年5月9日
    00
  • CCleaner Pro怎么激活?CCleaner专业版注册破解激活教程(附下载)

    CCleaner Pro激活攻略 1. 下载CCleaner专业版安装文件 首先,你需要下载CCleaner专业版安装文件。你可以在官方网站上下载安装文件,也可以在其他下载站点上下载。注意,要下载专业版,而不是免费版。 下载完成后,双击安装文件并按照提示进行安装。 2. 获取CCleaner专业版注册码 在你安装CCleaner专业版后,你将需要注册码来激活…

    C 2023年5月23日
    00
  • C语言中的程序环境与预处理详情

    下面是关于“C语言中的程序环境与预处理详情”的完整攻略。 程序环境 概述 C程序必须在一个特定的环境中运行。一般来说,这个环境需要满足以下条件: 能读取程序源代码。 能够编译程序源代码,生成可执行文件。 能够执行可执行文件。 这个环境通常由操作系统提供。例如,Windows系统提供了Visual Studio等开发工具,可以用于开发并执行C程序。 编译器 编…

    C 2023年5月23日
    00
  • C++ 如何将string转换成全小写

    将string转换成全小写的方法可以使用C++标准库中的algorithm头文件中的transform函数来实现。具体实现流程如下: 包含头文件<algorithm>和<string>。 定义一个string类型的字符串源字符串。 定义一个string类型的字符串目标字符串。 使用transform()函数转换目标字符串。 cpp s…

    C 2023年5月23日
    00
  • 使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇

    关于“使用jQuery向ASP.NET MVC传递复杂JSON数据-ModelBinder篇”的完整攻略可以分为以下几个步骤: 1. 创建MVC项目 在开始使用jQuery向ASP.NET MVC传递复杂JSON数据-ModelBinder篇的攻略前,首先需要创建一个MVC项目,可以使用Visual Studio创建。在创建MVC项目时需要选择ASP.NET…

    C 2023年5月23日
    00
  • jsoneditor二次封装实时预览json编辑器组件react版

    为了方便大家使用 JSON 编辑器组件,可以对 jsoneditor 进行二次封装。下面是关于如何实现 jsoneditor 的二次封装的详细攻略。 准备工作 在开始实现之前,我们需要做一些准备工作: 安装依赖:在项目根目录下运行以下命令安装所需依赖: npm install jsoneditor react 引入样式:在index.js 文件中引入样式 i…

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