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日

相关文章

  • Perl 函数集小结

    Perl 函数集小结 – 完整攻略 什么是 Perl 函数 Perl 函数是一段可重复使用的代码,用于实现某个具体的功能。Perl 中的函数通常带有参数,有时会返回值。Perl 函数通常需要先定义后使用。 Perl 函数的定义 在 Perl 中定义函数的语法如下: sub function_name { # 函数体 } 其中,function_name 为函…

    C 2023年5月23日
    00
  • C++11 std::function和std::bind 的使用示例详解

    针对你提到的主题,我会给出相应的markdown格式文本,包含标题、代码块和示例说明,内容完整细致。以下是详细讲解: C++11 std::function和std::bind 的使用示例详解 在C++11标准中,引入了std::function和std::bind两个函数模板,用于支持更灵活的函数对象(函数指针、成员函数指针、函数对象和lambda表达式)…

    C 2023年5月22日
    00
  • c语言定时器示例分享

    C语言定时器示例分享 本文将详细介绍C语言中定时器的使用方法及示例,帮助读者实现各种实用的定时器功能。 什么是定时器 定时器是一种程序设计中常用的计时工具,用来在指定的时间间隔内执行特定任务,并可以进行周期性的重复任务。在C语言中,通过使用定时器相关的函数和库,实现定时器功能变得十分便捷。 C语言中的定时器 由于C语言没有内置的定时器功能,因此需要调用操作系…

    C 2023年5月23日
    00
  • 用C语言画一个圆

    下面是用C语言画圆的完整攻略。 1. 前置知识 在绘制圆形之前需要先掌握以下内容: C语言基础:掌握C语言的基本语法和操作,包括变量、运算符、分支结构、循环结构等。 数学知识:了解圆的相关数学知识,如圆的半径、直径、周长、面积等。 图形学基础:掌握画图基本原理,了解坐标系、像素、颜色等概念。同时需要了解常用的图形库,如Windows.h、OpenGL等。 2…

    C 2023年5月24日
    00
  • C语言实现简单通讯录系统

    C语言实现简单通讯录系统攻略 1. 确定功能需求 在开始编写代码前,需要明确实现的功能需求。一个简单的通讯录功能包含以下几个方面: 添加联系人; 显示联系人列表; 修改联系人信息; 删除联系人。 2. 设计数据结构 在C语言中,可以使用结构体来存储联系人的相关信息。为了方便,我们可以使用动态内存分配来动态地创建存储联系人的结构体。 typedef struc…

    C 2023年5月23日
    00
  • 详解如何将c语言文件打包成exe可执行程序

    下面详细讲解如何将C语言文件打包成可执行程序。 1. 编写C语言代码 首先,需要编写C语言代码,比如我们可以写一个非常简单的“Hello World”程序,代码如下: #include <stdio.h> int main() { printf("Hello World!\n"); return 0; } 把以上程序保存为ma…

    C 2023年5月23日
    00
  • C++ TCP网络编程详细讲解

    C++ TCP网络编程详细讲解 简介 TCP网络编程是指基于传输控制协议(TCP)实现的网络通信,其主要特点是数据传输稳定可靠,适用于对数据传输要求较高的应用场景。在C++中,我们可以使用一些网络编程库(如Boost.Asio、Winsock等)来实现TCP网络编程。 步骤 1. 创建socket 在进行TCP网络编程时,我们需要先创建一个socket,通过…

    C 2023年5月24日
    00
  • c语言中main函数用法及知识点总结

    标题:C语言中main函数用法及知识点总结 什么是main函数? 在C语言中,main函数是一个程序的入口,也是程序执行的起点。当程序被调用时,操作系统会首先找到程序中的main函数并执行它。因此,main函数通常是程序中必不可少的一部分。 main函数的定义和格式 main函数的定义和格式如下所示: int main(int argc, char *arg…

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