热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android-wheel控件实现三级联动效果

这篇文章主要为大家详细介绍了android-wheel控件实现三级联动效果的代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了android wheel省市县三级联动效果,供大家参考,具体内容如下

在github上面有一个叫做 Android-wheel 的开源控件, 代码地址:https://github.com/maarek/android-wheel


源码下载地址:http://xiazai.jb51.net/201610/yuanma/AndroidCascadeMaster(jb51.net).rar

主界面布局

activity_main.xml

 
 
   
 
     
     
 
     
     
 
     
     
   
 
  

assets资源文件下--province_data.xml(一部分)

 
  
   
    
    
    
    
    
    
    
    
    
    
    
    
   

先看省份、城市、县乡的bean类
ProvinceModel

package com.mrwujay.cascade.model; 
 
import java.util.List; 
 
public class ProvinceModel { 
  private String name; 
  private List cityList; 
   
  public ProvinceModel() { 
    super(); 
  } 
 
  public ProvinceModel(String name, List cityList) { 
    super(); 
    this.name = name; 
    this.cityList = cityList; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public List getCityList() { 
    return cityList; 
  } 
 
  public void setCityList(List cityList) { 
    this.cityList = cityList; 
  } 
 
  @Override 
  public String toString() { 
    return "ProvinceModel [name=" + name + ", cityList=" + cityList + "]"; 
  } 
   
} 

package com.mrwujay.cascade.model; 
 
import java.util.List; 
 
public class CityModel { 
  private String name; 
  private List districtList; 
   
  public CityModel() { 
    super(); 
  } 
 
  public CityModel(String name, List districtList) { 
    super(); 
    this.name = name; 
    this.districtList = districtList; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public List getDistrictList() { 
    return districtList; 
  } 
 
  public void setDistrictList(List districtList) { 
    this.districtList = districtList; 
  } 
 
  @Override 
  public String toString() { 
    return "CityModel [name=" + name + ", districtList=" + districtList 
        + "]"; 
  } 
   
} 

DistrictModel

package com.mrwujay.cascade.model; 
 
public class DistrictModel { 
  private String name; 
  private String zipcode; 
   
  public DistrictModel() { 
    super(); 
  } 
 
  public DistrictModel(String name, String zipcode) { 
    super(); 
    this.name = name; 
    this.zipcode = zipcode; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public String getZipcode() { 
    return zipcode; 
  } 
 
  public void setZipcode(String zipcode) { 
    this.zipcode = zipcode; 
  } 
 
  @Override 
  public String toString() { 
    return "DistrictModel [name=" + name + ", zipcode=" + zipcode + "]"; 
  } 
 
} 

看自定义的XmlParserHandler

package com.mrwujay.cascade.service; 
 
import java.util.ArrayList; 
import java.util.List; 
import org.xml.sax.Attributes; 
import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 
 
import com.mrwujay.cascade.model.CityModel; 
import com.mrwujay.cascade.model.DistrictModel; 
import com.mrwujay.cascade.model.ProvinceModel; 
 
public class XmlParserHandler extends DefaultHandler { 
 
  /** 
   * 存储所有的解析对象 
   */ 
  private List provinceList = new ArrayList(); 
 
  public XmlParserHandler() { 
 
  } 
 
  /** 
   * 对外暴露的方法 
   */ 
  public List getDataList() { 
    return provinceList; 
  } 
 
  @Override 
  public void startDocument() throws SAXException { 
    // 当读到第一个开始标签的时候,会触发这个方法 
  } 
 
  ProvinceModel provinceModel = new ProvinceModel(); 
  CityModel cityModel = new CityModel(); 
  DistrictModel districtModel = new DistrictModel(); 
/** 
 *   
   
    
    
    
    
    
    
    
    
    
    
    
    
   
 */ 
  @Override 
  public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
    // 当遇到开始标记的时候,调用这个方法 
    if (qName.equals("province")) { 
      provinceModel = new ProvinceModel(); 
      provinceModel.setName(attributes.getValue(0)); 
      provinceModel.setCityList(new ArrayList()); 
    } else if (qName.equals("city")) { 
      cityModel = new CityModel(); 
      cityModel.setName(attributes.getValue(0)); 
      cityModel.setDistrictList(new ArrayList()); 
    } else if (qName.equals("district")) { 
      districtModel = new DistrictModel(); 
      districtModel.setName(attributes.getValue(0)); 
      districtModel.setZipcode(attributes.getValue(1)); 
    } 
  } 
 
  @Override 
  public void endElement(String uri, String localName, String qName) 
      throws SAXException { 
    // 遇到结束标记的时候,会调用这个方法 
    if (qName.equals("district")) { 
      cityModel.getDistrictList().add(districtModel); 
    } else if (qName.equals("city")) { 
      provinceModel.getCityList().add(cityModel); 
    } else if (qName.equals("province")) { 
      provinceList.add(provinceModel); 
    } 
  } 
 
  @Override 
  public void characters(char[] ch, int start, int length) 
      throws SAXException { 
  } 
 
} 

接下来看基类BaseActivity

package com.mrwujay.cascade.activity; 
 
import java.io.InputStream; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 
import android.app.Activity; 
import android.content.res.AssetManager; 
 
import com.mrwujay.cascade.model.CityModel; 
import com.mrwujay.cascade.model.DistrictModel; 
import com.mrwujay.cascade.model.ProvinceModel; 
import com.mrwujay.cascade.service.XmlParserHandler; 
 
public class BaseActivity extends Activity { 
 
  /** 
   * 所有省 
   */ 
  protected String[] mProvinceDatas; 
  /** 
   * key - 省 value - 市 
   */ 
  protected Map mCitisDatasMap = new HashMap(); 
  /** 
   * key - 市 values - 区 
   */ 
  protected Map mDistrictDatasMap = new HashMap(); 
 
  /** 
   * key - 区 values - 邮编 
   */ 
  protected Map mZipcodeDatasMap = new HashMap(); 
 
  /** 
   * 当前省的名称 
   */ 
  protected String mCurrentProviceName; 
  /** 
   * 当前市的名称 
   */ 
  protected String mCurrentCityName; 
  /** 
   * 当前区的名称 
   */ 
  protected String mCurrentDistrictName = ""; 
 
  /** 
   * 当前区的邮政编码 
   */ 
  protected String mCurrentZipCode = ""; 
 
  /** 
   * 解析省市区的XML数据 
   */ 
 
  protected void initProvinceDatas() { 
    //省份集合列表 
    List provinceList = null; 
    //获取资源 
    AssetManager asset = getAssets(); 
    try { 
      //获取输入流 
      InputStream input = asset.open("province_data.xml"); 
      // 创建一个解析xml的工厂对象 
      SAXParserFactory spf = SAXParserFactory.newInstance(); 
      // 解析xml 
      SAXParser parser = spf.newSAXParser(); 
      //解析工具 
      XmlParserHandler handler = new XmlParserHandler(); 
      //进行解析 
      parser.parse(input, handler); 
      input.close(); 
      // 获取解析出来的数据 
      provinceList = handler.getDataList(); 
      // */ 初始化默认选中的省、市、区 
      if (provinceList != null && !provinceList.isEmpty()) { 
        //获取第一个省份 
        mCurrentProviceName = provinceList.get(0).getName(); 
        List cityList = provinceList.get(0).getCityList(); 
        if (cityList != null && !cityList.isEmpty()) { 
          //获取第一个省份的第一个城市名 
          mCurrentCityName = cityList.get(0).getName(); 
          List districtList = cityList.get(0) 
              .getDistrictList(); 
          //获取第一个省份的第一个城市的第一个县名称 
          mCurrentDistrictName = districtList.get(0).getName(); 
          mCurrentZipCode = districtList.get(0).getZipcode(); 
        } 
      } 
      // */ 
      mProvinceDatas = new String[provinceList.size()]; 
      for (int i = 0; i  cityList = provinceList.get(i).getCityList(); 
        String[] cityNames = new String[cityList.size()]; 
        for (int j = 0; j  districtList = cityList.get(j) 
              .getDistrictList(); 
          String[] distrinctNameArray = new String[districtList 
              .size()]; 
          DistrictModel[] distrinctArray = new DistrictModel[districtList 
              .size()]; 
          for (int k = 0; k 

主界面MainActivity

package com.mrwujay.cascade.activity; 
 
import com.mrwujay.cascade.R; 
import com.mrwujay.cascade.R.id; 
import com.mrwujay.cascade.R.layout; 
 
import kankan.wheel.widget.OnWheelChangedListener; 
import kankan.wheel.widget.WheelView; 
import kankan.wheel.widget.adapters.ArrayWheelAdapter; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 
 
public class MainActivity extends BaseActivity implements OnClickListener, OnWheelChangedListener { 
  private WheelView mViewProvince; 
  private WheelView mViewCity; 
  private WheelView mViewDistrict; 
  private Button mBtnConfirm; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    setUpViews(); 
    setUpListener(); 
    setUpData(); 
  } 
   
  private void setUpViews() { 
    mViewProvince = (WheelView) findViewById(R.id.id_province); 
    mViewCity = (WheelView) findViewById(R.id.id_city); 
    mViewDistrict = (WheelView) findViewById(R.id.id_district); 
    mBtnCOnfirm= (Button) findViewById(R.id.btn_confirm); 
  } 
   
  private void setUpListener() { 
    // 添加change事件 
    mViewProvince.addChangingListener(this); 
    // 添加change事件 
    mViewCity.addChangingListener(this); 
    // 添加change事件 
    mViewDistrict.addChangingListener(this); 
    // 添加onclick事件 
    mBtnConfirm.setOnClickListener(this); 
  } 
   
  private void setUpData() { 
    initProvinceDatas(); 
    mViewProvince.setViewAdapter(new ArrayWheelAdapter(MainActivity.this, mProvinceDatas)); 
    // 设置可见条目数量 
    mViewProvince.setVisibleItems(7); 
    mViewCity.setVisibleItems(7); 
    mViewDistrict.setVisibleItems(7); 
    updateCities(); 
    updateAreas(); 
  } 
 
  /** 
   * 根据当前的省,更新市WheelView的信息 
   */ 
  private void updateCities() { 
    //获取当前的省份的itme索引值 
    int pCurrent = mViewProvince.getCurrentItem(); 
    //湖区当前省份名字 
    mCurrentProviceName = mProvinceDatas[pCurrent]; 
    //获取该省份下面的市数组集合 
    String[] cities = mCitisDatasMap.get(mCurrentProviceName); 
    if (cities == null) { 
      cities = new String[] { "" }; 
    } 
    mViewCity.setViewAdapter(new ArrayWheelAdapter(this, cities)); 
    mViewCity.setCurrentItem(0); 
    updateAreas(); 
  } 
  /** 
   * 根据当前的市,更新区WheelView的信息 
   */ 
  private void updateAreas() { 
    int pCurrent = mViewCity.getCurrentItem(); 
    mCurrentCityName = mCitisDatasMap.get(mCurrentProviceName)[pCurrent]; 
    String[] areas = mDistrictDatasMap.get(mCurrentCityName); 
 
    if (areas == null) { 
      areas = new String[] { "" }; 
    } 
    mViewDistrict.setViewAdapter(new ArrayWheelAdapter(this, areas)); 
    mViewDistrict.setCurrentItem(0); 
  } 
 
   
   
  /** 
   * 实现接口方法的回调 
   */ 
  @Override 
  public void onChanged(WheelView wheel, int oldValue, int newValue) { 
    // TODO Auto-generated method stub 
    if (wheel == mViewProvince) { 
      updateCities(); 
    } else if (wheel == mViewCity) { 
      updateAreas(); 
    } else if (wheel == mViewDistrict) { 
      //获取县的名字 
      mCurrentDistrictName = mDistrictDatasMap.get(mCurrentCityName)[newValue]; 
      //获取县的编码 
      mCurrentZipCode = mZipcodeDatasMap.get(mCurrentDistrictName); 
    } 
  } 
 
 
 
  @Override 
  public void onClick(View v) { 
    switch (v.getId()) { 
    case R.id.btn_confirm: 
      showSelectedResult(); 
      break; 
    default: 
      break; 
    } 
  } 
 
  private void showSelectedResult() { 
    Toast.makeText(MainActivity.this, "当前选中:"+mCurrentProviceName+","+mCurrentCityName+"," 
        +mCurrentDistrictName+","+mCurrentZipCode, Toast.LENGTH_SHORT).show(); 
  } 
} 

还有2个drawable
wheel_bg.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
 
   
 

wheel_val.xml

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
   
 
   
 
 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文介绍如何使用 Sortable.js 库实现元素的拖拽和位置交换功能。Sortable.js 是一个轻量级、无依赖的 JavaScript 库,支持拖拽排序、动画效果和多种插件扩展。通过简单的配置和事件处理,可以轻松实现复杂的功能。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文详细介绍了如何在 Spring Boot 应用中通过 @PropertySource 注解读取非默认配置文件,包括配置文件的创建、映射类的设计以及确保 Spring 容器能够正确加载这些配置的方法。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
author-avatar
秋秋传奇哦_729
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有