Android应用-Spinner(联动)详细代码

1 要求

    1、使用spinner或类似效果控件实现省份和城市的联动选择和显示。

    2、至少包含10个省份,每个省份包含至少10个城市,每个城市包含至少3个区县。

    3、点击界面中“添加按钮”,可增加当前显示城市的1个区县,长按按钮弹出AlertDialog,并在其中显示当前省份的所有城市。

    4、点击界面中“删除按钮”,删除当前显示省份及其下所有城市及区县。

    5、点击界面中“初始化按钮”,将数据恢复到步骤2状态。

2 Android程序代码

  1)activity_main.xml(布局文件)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="#673AB7"
        android:text=""
        android:textSize="20dp"
        android:layout_marginTop="10dp"/>
    <Spinner
        android:id="@+id/provinceSpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="50dp" />

    <Spinner
        android:id="@+id/citySpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/provinceSpinner"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp" />

    <Spinner
        android:id="@+id/countySpinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/citySpinner"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp" />

    <TextView
        android:id="@+id/selectedItemsTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/countySpinner"
        android:textColor="@color/red"
        android:layout_marginTop="30dp"/>

    <Button
        android:id="@+id/addButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/selectedItemsTextView"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:background="#59BCE8"
        android:text="添加" />

    <Button
        android:id="@+id/deleteButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/addButton"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:background="#EDAD99"
        android:text="删除" />

    <Button
        android:id="@+id/initButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/deleteButton"
        android:layout_centerHorizontal="true"
        android:background="#A2E3A5"
        android:layout_marginTop="20dp"
        android:text="初始化" />
</RelativeLayout>

  2)MainActivity.java

package com.lt;

import static android.view.Gravity.CENTER;
import android.annotation.SuppressLint;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    private Spinner provinceSpinner, citySpinner, countySpinner;// 声明3个Spinner对象,用于选择省份、城市、区县
    private Button addButton, deleteButton, initButton;// 声明3个按钮对象,用于添加、删除、初始化选项
    private TextView selectedItemsTextView;// 声明一个TextView对象,用于显示操作的内容
    private HashMap<String, List<String>> cityMap;// 声明一个HashMap对象,用于存储省份和对应的城市列表
    private HashMap<String, List<String>> countyMap;// 声明一个HashMap对象,用于存储城市和对应的县区列表
    private List<String> provinces;// 声明一个List对象,用于存储省份列表
    private ArrayAdapter<String> provinceAdapter, cityAdapter, countyAdapter;// 声明3个ArrayAdapter对象,分别用于为省份、城市、区县Spinner设置适配器

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        selectedItemsTextView=findViewById(R.id.selectedItemsTextView);// 绑定选中的项目文本视图
        provinceSpinner = findViewById(R.id.provinceSpinner);// 绑定省份下拉框
        citySpinner = findViewById(R.id.citySpinner);// 绑定城市下拉框
        countySpinner = findViewById(R.id.countySpinner);// 绑定县区下拉框
        addButton = findViewById(R.id.addButton);// 绑定添加按钮
        deleteButton = findViewById(R.id.deleteButton);// 绑定删除按钮
        initButton = findViewById(R.id.initButton);// 绑定初始化按钮
        provinces = new ArrayList<>();// 创建一个ArrayList用于存储省份数据
        cityMap = new HashMap<>();// 创建一个HashMap用于存储城市数据,键是省份名,值是对应城市的ArrayList
        countyMap = new HashMap<>();// 创建一个HashMap用于存储县区数据,键是城市名,值是对应县区的ArrayList
        initData();// 初始化数据
        initSpinner();// 初始化下拉列表框(spinner)

        addButton.setOnClickListener(new View.OnClickListener() {// 为addButton设置点击事件监听器
            @SuppressLint("ResourceAsColor")
            @Override
            public void onClick(View v) {
                String selectedCounty = (String) countySpinner.getSelectedItem();// 获取用户在countySpinner中选择的县区名称
                String selectedCity = (String) citySpinner.getSelectedItem();// 获取用户在citySpinner中选择的城市名称
                String selectedProvince = (String) provinceSpinner.getSelectedItem();// 获取用户在provinceSpinner中选择的省份名称

                List<String> counties = countyMap.get(selectedCity);// 根据所选城市获取对应的县区列表(ArrayLi
                if (counties != null) {// 判断县区列表是否为空
                    counties.add(selectedCounty + " 新增");// 将新添加的县区名添加到县区列表中,并更新数据适配器
                    countyAdapter.notifyDataSetChanged();
                }
                // 设置要显示的文字内容,包括所选的省、市、县
                String selectedItems1 = "当前添加省-市(州)-县(区、市)是:" + selectedProvince + "-" + selectedCity + "-" + selectedCounty;
                selectedItemsTextView.setTextSize(15);
                selectedItemsTextView.setGravity(CENTER);
                selectedItemsTextView.setText(selectedItems1);
            }
        });

        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 删除当前显示省份及其下所有城市和区县
                String selectedProvince = (String) provinceSpinner.getSelectedItem();
                // 从provinces中移除当前省份
                provinces.remove(selectedProvince);
                // 判断当前显示省份是否存在于cityMap中
                if(cityMap.containsKey(selectedProvince)){
                    // 从cityMap中移除当前省份
                    cityMap.remove(selectedProvince);
                    // 清空当前城市和区县的选择
                    citySpinner.setSelection(0);
                    countySpinner.setSelection(0);
                    // 清空城市和区县的数据
                    cityAdapter.clear();
                    countyAdapter.clear();
                    // 通知适配器数据已更新,省、市、区进行更新
                    provinceAdapter.notifyDataSetChanged();
                    cityAdapter.notifyDataSetChanged();
                    countyAdapter.notifyDataSetChanged();
                }
                String selectedItems2 = "当前删除的省及其下的所有城市及区县是:" + selectedProvince ;
                selectedItemsTextView.setTextSize(15);
                selectedItemsTextView.setGravity(CENTER);
                selectedItemsTextView.setText(selectedItems2);
            }
        });


        initButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                provinces.clear();
                cityAdapter.clear();
                countyAdapter.clear();
                initData();
                initSpinner();
                selectedItemsTextView.setText("");//文本清空
            }
        });
        // 设置addButton的长按监听器
        addButton.setOnLongClickListener(new View.OnLongClickListener() {//设置长按监听器
            @Override
            public boolean onLongClick(View v) {
                List<String> cities = cityMap.get((String) provinceSpinner.getSelectedItem());// 根据所选省份获取对应的城市列表
                StringBuilder cityList = new StringBuilder();// 创建一个StringBuilder对象,用于存储城市列表中的所有城市名
                if (cities != null) {// 如果城市列表不为空,则遍历该列表,将每个城市名添加到StringBuilder中,并在每个城市名后面
                    for (String city : cities) {
                        cityList.append(city).append("\n");
                    }
                }
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);// 创建一个AlertDialog.Builder对象,用于构建对话框
                builder.setTitle((String) provinceSpinner.getSelectedItem() + "的城市");// 设置对话框的标题为当前所选省份的名字
                builder.setMessage(cityList.toString());// 设置对话框的消息内容为所有的城市名(使用StringBuilder对象的内容)
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {// 设置对话框的确定按钮的点击事件监听器,当用户点击确定按钮时,关闭对话框
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });
                builder.show();// 显示对话框
                return true;// 返回true,表示已处理长按事件
            }
        });
    }

    private void initData() {
        provinces.add("云南省");provinces.add("贵州省");provinces.add("四川省");provinces.add("湖南省");provinces.add("湖北省");provinces.add("广东省");provinces.add("福建省");provinces.add("浙江省");provinces.add("陕西省");provinces.add("山东省");
        for (String province : provinces) {
            List<String> cities = new ArrayList<>();
            cityMap.put(province, cities);
            if ("云南省".equals(province)) {
                cities.add("昆明市");cities.add("曲靖市");cities.add("昭通市");cities.add("丽江市");cities.add("普洱市");cities.add("临沧市");cities.add("楚雄彝族自治州");cities.add("红河哈尼族彝族自治州");cities.add("文山壮族苗族自治州");cities.add("西双版纳傣族自治州");
            } else if ("贵州省".equals(province)) {
                cities.add("贵阳市");cities.add("六盘水市");cities.add("遵义市");cities.add("安顺市");cities.add("毕节市");cities.add("铜仁市");cities.add("黔东南苗族侗族自治州");cities.add("黔南布依族苗族自治州");cities.add("黔西南布依族苗族自治州");cities.add("贵安新区");
            } else if ("四川省".equals(province)) {
                cities.add("成都市");cities.add("自贡市");cities.add("攀枝花市");cities.add("泸州市");cities.add("德阳市");cities.add("绵阳市");cities.add("广元市");cities.add("遂宁市");cities.add("内江市");cities.add("乐山市");
            } else if ("湖南省".equals(province)) {
                cities.add("长沙市");cities.add("株洲市");cities.add("湘潭市");cities.add("衡阳市");cities.add("邵阳市");cities.add("岳阳市");cities.add("常德市");cities.add("张家界市");cities.add("益阳市");cities.add("郴州市");
            } else if ("湖北省".equals(province)) {
                cities.add("武汉市");cities.add("黄石市");cities.add("十堰市");cities.add("宜昌市");cities.add("襄阳市");cities.add("鄂州市");cities.add("荆门市");cities.add("孝感市");cities.add("荆州市");cities.add("黄冈市");
            } else if ("广东省".equals(province)) {
                cities.add("广州市");cities.add("韶关市");cities.add("深圳市");cities.add("珠海市");cities.add("汕头市");cities.add("佛山市");cities.add("江门市");cities.add("湛江市");cities.add("茂名市");cities.add("肇庆市");
            } else if ("福建省".equals(province)) {
                cities.add("福州市");cities.add("厦门市");cities.add("莆田市");cities.add("三明市");cities.add("泉州市");cities.add("漳州市");cities.add("南平市");cities.add("龙岩市");cities.add("宁德市");cities.add("平潭综合实验区");
            } else if ("浙江省".equals(province)) {
                cities.add("杭州市");cities.add("宁波市");cities.add("温州市");cities.add("嘉兴市");cities.add("湖州市");cities.add("绍兴市");cities.add("金华市");cities.add("衢州市");cities.add("舟山市");cities.add("台州市");
            } else if ("陕西省".equals(province)) {
                cities.add("西安市");cities.add("铜川市");cities.add("宝鸡市");cities.add("咸阳市");cities.add("渭南市");cities.add("延安市");cities.add("汉中市");cities.add("榆林市");cities.add("安康市");cities.add("商洛市");
            } else if ("山东省".equals(province)) {
                cities.add("济南市");cities.add("青岛市");cities.add("淄博市");cities.add("枣庄市");cities.add("东营市");cities.add("烟台市");cities.add("潍坊市");cities.add("济宁市");cities.add("泰安市");cities.add("威海市");
            }
            for (String city : cities) {
                List<String> counties = new ArrayList<>();
                countyMap.put(city, counties);
                if("昆明市".equals(city)){counties.add("官渡区");counties.add("盘龙区");counties.add("五华区");counties.add("西山区");counties.add("东川区");counties.add("呈贡区");counties.add("晋宁县");counties.add("富民县");counties.add("宜良县");
                    }else if("曲靖市".equals(city)){counties.add("麒麟区");counties.add("沾益区");counties.add("马龙区");counties.add("陆良县");counties.add("师宗县");counties.add("罗平县");counties.add("富源县");counties.add("会泽县");counties.add("宣威市");
                    }else if("昭通市".equals(city)){counties.add("昭阳区");counties.add("鲁甸县");counties.add("巧家县");counties.add("盐津县");counties.add("镇雄县");counties.add("威信县");counties.add("彝良县");counties.add("永善县"); counties.add("绥江县");
                    }else if("丽江市".equals(city)){counties.add("古城区");counties.add("玉龙纳西族自治县");counties.add("永胜县");counties.add("华坪县");counties.add("宁蒗彝族自治县");
                    }else if("普洱市".equals(city)){counties.add("思茅区");counties.add("宁洱哈尼族彝族自治县");counties.add("墨江哈尼族自治县");counties.add("景东彝族自治县");counties.add("景谷傣族彝族自治县");counties.add("镇沅彝族哈尼族拉祜族自治县");counties.add("江城哈尼族彝族自治县");counties.add("孟连傣族拉祜族佤族自治县"); counties.add("澜沧拉祜族自治县");counties.add("西盟佤族自治县");
                    }else if("临沧市".equals(city)){counties.add("临翔区");counties.add("凤庆县");counties.add("云县公安局");counties.add("永德县");counties.add("镇康县");counties.add("双江拉祜族佤族布朗族傣族自治县");counties.add("耿马傣族佤族自治县");counties.add("沧源佤族自治县");
                }
                if("贵阳市".equals(city)){ }
                for (int k = 1; k <= 3; k++) {
                    counties.add("区县" + k);
                }
            }
        }
    }
    // 初始化spinner的方法
    private void initSpinner () {
        provinceAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item, provinces); // 创建一个ArrayAdapter对象,用于显示省份数据
        provinceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);// 设置下拉列表框的样式
        provinceSpinner.setAdapter(provinceAdapter); // 将ArrayAdapter设置到provinceSpinner中
        provinceSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {// 为provinceSpinner设置选择事件监听器
            // 当用户选择了一个省份时的处理逻辑
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                String province = (String) provinceSpinner.getSelectedItem();   // 获取所选省份的名字
                List<String> cities = cityMap.get(province);// 根据所选省份获取对应的城市列表(ArrayList<String>)
                if (cities != null) { // 如果城市列表不为空,则创建一个新的ArrayAdapter对象,用于显示城市数据,并将该对象设置到citySpinner中
                    cityAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, cities);
                    cityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    citySpinner.setAdapter(cityAdapter);
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) { // 当用户没有选择任何省份时的处理逻辑
            }
        });

        // 为citySpinner设置选择事件监听器
        citySpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            // 当用户选择了一个城市时的处理逻辑
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { // 获取所选城市的名
                String city = (String) citySpinner.getSelectedItem();
                List<String> counties = countyMap.get(city);  // 根据所选城市获取对应的县区列表(ArrayList<String>)
                if (counties != null) {// 如果县区列表不为空,则创建一个新的ArrayAdapter对象,用于显示县区数据,并将该对象设置到countySpinner中
                    countyAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_spinner_item, counties);
                    countyAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                    countySpinner.setAdapter(countyAdapter);
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {// 当用户没有选择任何城市时的处理逻辑
            }
        });
    }
}

3 运行截图

图片

图片

图片

图片

图片

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天林望海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值