Android spinner三级连动菜单实现核心代码

HFSS射频电路转PCB实战:从AutoCAD填充到Altium Designer铺铜的完整避坑指南 本文详细介绍了从HFSS射频电路仿真到Altium Designer PCB设计的完整流程,重点解决几何失真、电磁特性一致性和可制造性等核心问题。通过AutoCAD图形修复和AD导入优化,确保射频电路的高精度转换,提升设计效率和成功率。 阅读详情

“`
package com.l000phone.day05_spinnerexercise3;

import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.xmlpull.v1.XmlPullParser;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

import com.l000phone.entity.Province;
import com.l000phone.util.CityWeatherParse;

public class MainActivity extends Activity {
private Spinner sp_province_id;// 省份信息显示下拉列表框控件
private Spinner sp_city_id;// 市级信息显示下拉列表框控件
private Spinner sp_county_id;// 县级信息显示下拉列表框控件

private ArrayAdapter<String> provinceAdapter;
private ArrayAdapter<String> cityAdapter;
private ArrayAdapter<String> countyAdapter;

private String provinceName;// 选中的省份名
private Set<String> address;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 思路:
    // ①界面控件对象的获取
    sp_province_id = (Spinner) findViewById(R.id.sp_province_id);
    sp_city_id = (Spinner) findViewById(R.id.sp_city_id);
    sp_county_id = (Spinner) findViewById(R.id.sp_county_id);

    // ②准备数据源
    XmlPullParser parser = getResources().getXml(R.xml.citys_weather);
    List<Province> provinces = CityWeatherParse.getProvincesInfo(parser);
    address = new LinkedHashSet<>();

    // ③获得适配器对象
    provinceAdapter = new ArrayAdapter<>(this,
            android.R.layout.simple_spinner_dropdown_item,
            CityWeatherParse.getAllProvinceNames(provinces));

    cityAdapter = new ArrayAdapter<>(this,
            android.R.layout.simple_spinner_dropdown_item);

    countyAdapter = new ArrayAdapter<>(this,
            android.R.layout.simple_spinner_dropdown_item);

    // ④将适配器与Spinner控件进行绑定
    sp_province_id.setAdapter(provinceAdapter);
    sp_city_id.setAdapter(cityAdapter);
    sp_county_id.setAdapter(countyAdapter);

    // ⑤给Spinner下拉列表控件添加监听器(只需要给省份信息显示下拉列表框添加监听器即可)
    OnItemSelectedListener listener = new MyOnItemSelectedListener(
            provinces);
    sp_province_id.setOnItemSelectedListener(listener);
    sp_city_id.setOnItemSelectedListener(listener);
    sp_county_id.setOnItemSelectedListener(listener);
    sp_city_id.setSelection(0);

}

// 监听器OnItemSelectedListener实现类
private final class MyOnItemSelectedListener implements
        OnItemSelectedListener {
    private List<Province> provinces;

    public MyOnItemSelectedListener(List<Province> provinces) {
        super();
        this.provinces = provinces;
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.widget.AdapterView.OnItemSelectedListener#onItemSelected(
     * android.widget.AdapterView, android.view.View, int, long)
     */
    @Override
    public void onItemSelected(AdapterView<?> parent, View view,
            int position, long id) {
        address.add(((TextView)view).getText().toString());

        // 思路:
        // ①根据选中的省份信息,将该省份对应的所有市级信息读取出来,设置到cityAdapter中
        // ②根据选中的市级信息,将该市对应的所有县级信息读取出来,设置到countyAdapter中
        String cityName;

        switch (parent.getId()) {
        case R.id.sp_province_id:
            // -->修改市级适配器
            // a)获取省份的名字
            provinceName = ((TextView) view).getText().toString();

            // b)将省份对应的所有市读取取出来
            List<String> allCities = CityWeatherParse.getAllCityNames(// 在这儿用 就相当于 是 局部变量喽
                    provinceName, provinces);

            // c)修改适配器,并通知控件刷新
            cityAdapter.clear();
            cityAdapter.addAll(allCities);
            cityAdapter.notifyDataSetChanged();

            // 更新县级适配器操作
            cityName = allCities.get(0);
            modifyCountyAdapter(cityName);
            MainActivity.this.setTitle("您的籍贯是:"+address.toString());
            break;
        case R.id.sp_city_id:
            // 获取市的名字
            cityName = ((TextView) view).getText().toString();
            Log.i("PROVINCE_NAME", provinceName);
            // 更新县级适配器操作
            modifyCountyAdapter(cityName);
            MainActivity.this.setTitle("您的籍贯是:"+address.toString());
            break;
        case R.id.sp_county_id:
            MainActivity.this.setTitle("您的籍贯是:"+address.toString());
            address.clear();
            break;

        default:
            break;
        }


    }

    /**
     * @param view
     */
    private void modifyCountyAdapter(String cityName) {

        // b)将市对应的所有县读取取出来
        List<String> allCounties = CityWeatherParse.getAllCountyames(
                cityName, provinceName, provinces);

        // c)修改适配器,并通知控件刷新
        countyAdapter.clear();
        countyAdapter.addAll(allCounties);
        countyAdapter.notifyDataSetChanged();
        sp_county_id.setSelection(0);
    }

    /*
     * (non-Javadoc)
     * 
     * @see
     * android.widget.AdapterView.OnItemSelectedListener#onNothingSelected
     * (android.widget.AdapterView)
     */
    @Override
    public void onNothingSelected(AdapterView<?> parent) {

    }

}

}

“`util

/**
 * 
 */
package com.l000phone.util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;

import com.l000phone.entity.City;
import com.l000phone.entity.County;
import com.l000phone.entity.Province;

/**
 * Description: 城市天气情况解析<br/>
 * Copyright (c) , 2016, Jansonxu <br/>
 * This program is protected by copyright laws. <br/>
 * Program Name:CityWeatherParse.java <br/>
 * Date: 2016-2-17
 * 
 * @author ly
 * @version : 1.0
 */
public class CityWeatherParse {

    /**
     * 获取所有省份的名字
     * 
     * @param provinces
     * @return
     */
    public static List<String> getAllProvinceNames(List<Province> provinces) {
        List<String> allNames = new LinkedList<>();
        for (Province Provice : provinces) {
            allNames.add(Provice.getPn());
        }

        return allNames;
    }

    /**
     * 
     * @param parser
     * @return
     */
    public static List<Province> getProvincesInfo(XmlPullParser parser) {
        // 思路
        @SuppressWarnings("unused")
        InputStream is = null;
        List<Province> provinces = null;// 存放所有的省份信息
        try {

            // 解析
            int eventType = parser.getEventType();
            Province province = null;// 省份实例声明
            City city = null;// 城市实例的声明
            County county = null;// 县实例的声明

            while (eventType != XmlPullParser.END_DOCUMENT) {
                String nodeName = parser.getName();

                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:
                    System.out.println("xml解析开始...");
                    provinces = new LinkedList<>();
                    break;
                case XmlPullParser.START_TAG:
                    if ("p".equals(nodeName)) {
                        province = new Province();// 省份实例的构建
                        // 将p节点的属性设置到Province实例中
                        setInstanceAttrValue(parser, province);
                    } else if ("pn".equals(nodeName)) {
                        province.setPn(parser.nextText());
                    } else if ("c".equals(nodeName)) {
                        city = new City();// 城市实例的构建
                        // 将c节点的属性设置到City实例中
                        setInstanceAttrValue(parser, city);
                    } else if ("cn".equals(nodeName)) {
                        city.setCn(parser.nextText());
                    } else if ("d".equals(nodeName)) {
                        county = new County();
                        setInstanceAttrValue(parser, county);
                        county.setDn(parser.nextText());

                        // 应该将其添加到City中
                        city.getCounties().add(county);
                    }

                    break;
                case XmlPullParser.END_TAG:
                    if ("c".equals(nodeName)) {
                        province.getCities().add(city);
                    } else if ("p".equals(nodeName)) {
                        provinces.add(province);
                    }

                    break;
                }
                eventType = parser.next();

            }

            System.out.println("xml解析结束...");
            // ④分析解析后的结果
            System.out.println("xml文件解析的结果是:");
            for (Province p : provinces) {
                System.out.println(p);
            }

        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // ⑤释放资源
            return provinces;
        }

    }

    /**
     * 设置实例的属性值
     * 
     * @param parser
     * @param obj
     */
    private static void setInstanceAttrValue(XmlPullParser parser, Object obj) {
        for (int index = 0; index < parser.getAttributeCount(); index++) {
            String attrName = parser.getAttributeName(index);
            String attrValue = parser.getAttributeValue(index);
            if ("p_id".equals(attrName)) {
                ((Province) obj).setP_id(attrValue);
            } else if ("c_id".equals(attrName)) {
                ((City) obj).setC_id(attrValue);
            } else if ("d_id".equals(attrName)) {
                ((County) obj).setD_id(attrValue);
            }
        }
    }

    /**
     * 根据传入的省份名,获取该省份下所有的市名
     * 
     * @param provinceName
     * @param provinces
     * @return
     */
    public static List<String> getAllCityNames(String provinceName,
            List<Province> provinces) {
        List<String> cityNames = new LinkedList<>();

        for (Province province : provinces) {
            if (provinceName != null && provinceName.equals(province.getPn())) {
                for (City city : province.getCities()) {
                    cityNames.add(city.getCn());
                }
                break;
            }
        }

        return cityNames;
    }

    /**
     * 根据传入的省份名、城市名,获得该城市下所有的县名
     * 
     * @param cityName
     * @param provinceName
     * @param provinces
     * @return
     */
    public static List<String> getAllCountyames(String cityName,
            String provinceName, List<Province> provinces) {
        List<String> countyNames = new LinkedList<>();

        EXIT_FLG: for (Province provice : provinces) {
            if (provinceName != null && provinceName.equals(provice.getPn())) {
                for (City city : provice.getCities()) {
                    if (cityName != null && cityName.equals(city.getCn())) {
                        for (County county : city.getCounties()) {
                            countyNames.add(county.getDn());
                        }
                        break EXIT_FLG;
                    }

                }
            }
        }

        Log.i("PROVINCE_NAME", "countyNames = " + countyNames + ",cityName = "
                + cityName + ",provinces=" + provinces);
        return countyNames;
    }

}

entity

/**
 * 
 */
package com.l000phone.entity;

import java.util.LinkedList;
import java.util.List;

/**
 * Description: 地级市实体类<br/>
 * Copyright (c) , 2016, Jansonxu <br/>
 * This program is protected by copyright laws. <br/>
 * Program Name:City.java <br/>
 * Date: 2016-2-17
 * 
 * @authorly
 * @version : 1.0
 */
public class City {
    private String c_id;// 城市的id
    private String cn;// 城市名字
    private List<County> counties = new LinkedList<>();// 多个县,县级市

    public City() {
        super();
    }

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

    public String getC_id() {
        return c_id;
    }

    public void setC_id(String c_id) {
        this.c_id = c_id;
    }

    public String getCn() {
        return cn;
    }

    public void setCn(String cn) {
        this.cn = cn;
    }

    public List<County> getCounties() {
        return counties;
    }

    public void setCounties(List<County> counties) {
        this.counties = counties;
    }

    @Override
    public String toString() {
        return "City [c_id=" + c_id + ", cn=" + cn + ", counties=" + counties
                + "]";
    }

}

/**
*
*/
package com.l000phone.entity;

/**
* Description: 县(县级市)实体类

* Copyright (c) , 2016, Jansonxu

* This program is protected by copyright laws.

* Program Name:County.java

* Date: 2016-2-17
*
* @author ly
* @version : 1.0
*/
public class County {
private String d_id;// 县的id
private String dn;// 县名

public County() {
    super();
}

public County(String d_id, String dn) {
    super();
    this.d_id = d_id;
    this.dn = dn;
}

public String getD_id() {
    return d_id;
}

public void setD_id(String d_id) {
    this.d_id = d_id;
}

public String getDn() {
    return dn;
}

public void setDn(String dn) {
    this.dn = dn;
}

@Override
public String toString() {
    return "County [d_id=" + d_id + ", dn=" + dn + "]";
}

}

/**
*
*/
package com.l000phone.entity;

import java.util.LinkedList;
import java.util.List;

/**
* Description: 省份实体类

* Copyright (c) , 2016, Jansonxu

* This program is protected by copyright laws.

* Program Name:Province.java

* Date: 2016-2-17
*
* @author ly
* @version : 1.0
*/
public class Province {
private String p_id;// 省份id
private String pn;// 省份名字
private List cities = new LinkedList<>();// 多个地级市

public Province() {
    super();
}

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

public String getP_id() {
    return p_id;
}

public void setP_id(String p_id) {
    this.p_id = p_id;
}

public String getPn() {
    return pn;
}

public void setPn(String pn) {
    this.pn = pn;
}

public List<City> getCities() {
    return cities;
}

public void setCities(List<City> cities) {
    this.cities = cities;
}

@Override
public String toString() {
    return "Province [p_id=" + p_id + ", pn=" + pn + ", cities=" + cities
            + "]";
}

}

“`

Android Spinner组件交互与实现 本文还有配套的精品资源,点击获取 简介:Spinner检索是一种用户交互组件,常用于Android应用中的下拉选择菜单。本篇详细介绍Spinner组件的结构、创建和自定义方法,以及如何与搜索功能结合。通过示例代码,展示了如何在Java中设置Spinner以及处理用户选择事件。最后,探讨了Spinner的测试和在不同场景下的应用,以提高应用的用户体验。 1. Spi... 阅读详情

相关推荐

Android实战:基于Spinner的星座选择下拉菜单开发详解

在Android应用开发中,界面的构建是用户交互体验的第一道门槛。一个清晰、结构合理且具备良好可维护性的UI设计,不仅提升了用户体验,也为后续逻辑处理打下坚实基础。Spinner作为常见的选择控件,其UI实现依赖于XML布局文件与资源系统的协同工作。本章将深入剖析如何通过标准的Android XML语法声明Spinner控件,并结合资源管理机制完成从静态定义到动态引用的完整流程。重点在于理解控件属性配置原则、布局容器适配策略以及字符串资源的组织方式,从而实现高内聚、低耦合的界面层设计。

weixin_31659095的博客 1106

最强三级联动 最简易三级联动 代码少就完事儿了 详解【一看就懂】

我们工作、学习中,都会遇到联动需求,这里一套万能简易强大的代码送给大家。 展示列表如图所示,这里以三级联动为例,多级联动以此类推...

杨大仙 4896

Android Spinner控件的实践与示例

本文还有配套的精品资源,点击获取 简介:Spinner是Android开发中常用的控件,用于展示下拉选择菜单供用户选择。通过SpinnerTest示例,初学者能学习到如何集成和使用Spinner,包括其布局、数据源绑定、事件监听和自定义样式。该示例项目展示了Spinner的基本用法和对用户选择事件的响应,帮助初学者为后续的Android开发打下坚实基础。 1. S...

weixin_36019375的博客 2268

Android实现三级联动下拉框 下拉列表spinner的实例代码

这篇文章介绍了Android实现三级联动下拉框 下拉列表spinner的实例代码,有需要的朋友可以参考一下 主要实现办法:动态加载各级下拉值的适配器 在监听本级下拉框,当本级下拉框的选中值改变时,随之修改下级的适配器的绑定值 XML布局: 复制代码 代码如下:     xmlns:tools="http://schemas.android.com/tools"    

专注Android开发 1763

Android自定义Spinner样式设计与实现详解

在Android应用开发中,Spinner作为常见的UI控件之一,广泛应用于下拉选择、分类筛选、表单配置等交互场景。其默认样式虽然简洁,但在实际项目中往往难以满足品牌设计或用户体验的需求。因此,掌握Spinner的自定义能力成为提升界面美观性和一致性的关键技能。// 示例:基础Spinner初始化逻辑。

weixin_42515392的博客 963

仿美团多级下拉列表菜单在Android中的实现方法

Spinner控件是一种常用的选择器,它提供一个下拉列表供用户选择。在多级菜单的实现中,Spinner可以帮助我们创建具有层级结构的菜单界面,使得用户可以通过简洁的操作完成复杂的任务选择。在Android开发中,是一种特殊的适配器,用于将数据绑定到UI组件中。具体到的作用是将分组数据和子项数据展示在列表中。适配器负责管理数据和视图之间的绑定关系,以及处理数据集变更时的视图更新。在实现自定义适配器时,需要了解其工作原理,如何与数据源进行交互,以及如何响应数据变化。

weixin_28746457的博客 942

Android基础控件之Spinner下拉列表(三级列表的实现)

Spinner的三级列表实现,需要考虑到三级适配器的动态绑定,所以我是这么做的 有写的很好的大神,欢迎指点,分享给大家 xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:b

wuqin1101的博客 861

Android实现省市区三级联动效果 Spinner

安卓学习过程中的一个实验报告,主要目的是为了使用spinner实现省市县三级联动

Android实现三级联动下拉框 下拉列表spinner

Android实现三级联动下拉框 下拉列表spinner Android实现(省、市、县)三级联动下拉框 下拉列表spinner 转载请注明出处: http://www.goteny.com/articles/2013/11/46.html htt...

weixin_30940783的博客 640

android(三级联动)全国省市县下拉地址选择源码

android(三级联动)全国省市县下拉地址选择源码

安卓开发xml解析省市县三级联动Spinner下拉列表源码

安卓开发xml解析,省市县三级联动Spinner下拉列表源码(含注释)

android联动下拉菜单,Android spinner下拉框连动

本代码主要功能1、 向拉菜单 spinner添加数据2、下拉菜单连动以下是核心代码//定义变量private Spinner spinner3;private Spinner spinner4;private Map> gaderMap=new HashMap>();private List gader=new ArrayList<>();private List stud...

weixin_29090089的博客 384

spinner三级联动显示

多个spinner一起使用,三级spinner联动显示,实现省、市、县联动显示

Android自定义Spinner下拉菜单样式实战

本文详细介绍了Android自定义Spinner下拉菜单样式的实战方法。通过自定义PopupWindow、设计适配器和处理点击事件,开发者可以实现圆角背景、图标集成、动画效果等个性化下拉样式,提升应用美观度和用户体验。

cnn8visionary的博客 525

三级联动java源码

省、市、镇三级联动java完整源码(可以直接运行项目),有mysql生成语句。

CISP-PTE考前实操练习题

CISP-PTE考前学习练习题目,渗透测试功工程师

2301_79546223的博客 2003

Android实现带搜索框的Spinner (附带源码)

Android实现带搜索框的Spinner (附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1343

旋转矩阵推导

推导前提: 坐标使用右手坐标系,角度逆时针旋转为正。 绕X轴旋转角度为 俯仰角 即Pitch 绕Y轴旋转角度为 偏航角 即Yaw(Head) 绕Z轴旋转角度为 翻滚角 即Roll 一、平面二维坐标点的旋转 如右图所示,根据三角函数关系,可以列出向量OP与OP’的坐标表示形式: x = |OP|•cosα x′ = |OP|•cos(α+β) y = |OP|•sinα y′ = |OP|•sin(α+β) 将P′(x′,y′)表达式展开: x′ =

suixinger_lmh的随笔 1384

android 美团下拉菜单,Android仿美团分类下拉菜单实例代码

本文实例为大家分享了Android仿美团下拉菜单的实现代码,分类进行选择,供大家参考,具体内容如下效果图操作平台AS2.0第三方框架:butterknifebuild.gradledependencies {compile fileTree(dir: 'libs', include: ['*.jar'])testCompile 'junit:junit:4.12'compile 'com.andr...

weixin_30328003的博客 565

逆向分析第一步:如何从HEX文件‘还原’出单片机的原始程序与数据?

本文详细解析了如何从HEX文件逆向分析出单片机的原始程序与数据,涵盖了固件逆向的底层逻辑与实践。通过介绍HEX文件的结构、内存映像重建技术以及专业工具链的使用,帮助读者掌握从十六进制数据到可执行代码的完整流程,适用于嵌入式系统开发和逆向工程领域。

weixin_29745609的博客 317

UE5新手必看:如何在UMG控件中嵌入浏览器实现Web页面展示(附完整步骤)

本文为UE5新手提供了在UMG控件中无缝集成Web浏览器的完整实战指南。详细介绍了从启用WebBrowser插件、创建并配置WebBrowser控件蓝图,到编写动态加载与交互逻辑,以及在游戏关卡中实例化UI的全过程。文章还分享了性能优化技巧与常见问题排查方法,帮助开发者高效实现游戏UI内的Web页面展示与交互。

weixin_29243063的博客 712
上一篇: Android 弱引用二级缓存实现
下一篇: Android Junit 模块测试
一朵红杏
博客等级 码龄12年 51粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值