iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android自定义WheelView地区选择三级联动
  • 263
分享到

Android自定义WheelView地区选择三级联动

选择wheelview级联Android 2022-06-06 04:06:00 263人浏览 八月长安
摘要

本文实例为大家分享了WheelView地区选择三级联动的具体代码,供大家参考,具体内容如下 1. 效果 最近需要做一个地区选择的功能,但是在网上和GitHub上找了很久都没找到

本文实例为大家分享了WheelView地区选择三级联动的具体代码,供大家参考,具体内容如下

1. 效果

最近需要做一个地区选择的功能,但是在网上和GitHub上找了很久都没找到满意的,然后朋友推荐了一个给我,我花了点时间把代码大致看懂并改成我想要的,并写上我的理解。效果如图:

这里写图片描述

2. 注意

a. 首先我们要明白,网上这写三级联动的demo,不管是把数据库文件放在raw还是assets中,我们都要进行复制,将这个文件复制到app目录下,即

/data/data/"+context.getPackageName()+"/databases/

至于到底放在raw还是assets中哪里好些,我也在网上查了下,见这篇博客这里点击 ,但是按照这里面说的好像.db文件最好放在assets中,但是这个demo中拿过来,原来的.db文件就是放在raw中,所以我也没改了。
b. 最重要的一点,因为我们一般都是将选择完以后的数据都要上传到服务器中,但是因为每个后台要求的不一样,所以对于这个地区的.db文件也要求不一样,所以我们最主要的是学会读取数据库文件然后通过代码形成联动,举个例子,比如美团有自己的一个数据库,我们定位湖南长沙芙蓉区,然后进行地区选择,将岳麓区上传服务器并且请求数据下来,但是我们一般不会直接上传文字,一个是怕重名,还有一个就是文字不会绝对的准确,比如两个字的地名黄山 和 黄 山,看起来都对,但是你们的后台服务器接受的参数是黄山,而且使用别人的数据库中使黄 山,那就出事了,所以我们一般都是传编码,但是每个数据库中城市编码一般都是不一样,所以我们需要找后台拿匹配的数据库文件或者js文件。如图所示,两份数据库,一份是朋友推荐自带的,例外一份是我们的。

这里写图片描述

这里写图片描述

我的数据库中省市区只有一个表,而那份却有三个表,省 市 区三个表。并且编码也不一样,可以明显看出来。

3. 干货

a. 布局就直接贴代码了,很简单,mainactivity中就一个按钮,而popupwindow中是三个wheelview,


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="Http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:background="#00000000"
 android:gravity="bottom"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <LinearLayout
 android:id="@+id/ly_myinfo_changeaddress_child"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignParentBottom="true"
 android:background="#ffffff"
 android:orientation="vertical" >
 <RelativeLayout
 android:layout_width="match_parent"
 android:layout_height="44dp"
 >
 <View
 android:background="@color/silver"
 android:layout_width="match_parent"
 android:layout_height="0.5dp" />
 <TextView
 android:id="@+id/btn_myinfo_cancel"
 android:layout_width="wrap_content"
 android:layout_height="match_parent"
 android:paddingLeft="18dp"
 android:text="取消"
 android:gravity="center"
 android:layout_alignParentLeft="true"
 android:layout_marginRight="15dip"
 android:textColor="#e84515"
 android:textSize="14sp" />
 <TextView
 android:id="@+id/btn_myinfo_sure"
 android:layout_width="wrap_content"
 android:layout_height="match_parent"
 android:layout_alignParentRight="true"
 android:gravity="center"
 android:text="完成"
 android:textColor="#e84515"
 android:paddingRight="18dp"
 android:textSize="14sp" />
 </RelativeLayout>
 <View android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#d8d8d8"/>
 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="190dip"
 android:orientation="horizontal"
 android:gravity="center_vertical">
 <guozhaohui.com.wlylocationchoose.locationchoose.WheelView
 android:id="@+id/provinceView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_weight="1"/>
 <guozhaohui.com.wlylocationchoose.locationchoose.WheelView
 android:id="@+id/cityView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_weight="1"/>
 <guozhaohui.com.wlylocationchoose.locationchoose.WheelView
 android:id="@+id/districtView"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_weight="1"/>
 </LinearLayout>
 </LinearLayout>
</LinearLayout>

b. 因为上面说了,需要将文件copy到app目录下,所以直接最好这代码在application中写,


package guozhaohui.com.wlylocationchoose;
import android.app.Application;
import java.io.InputStream;
import guozhaohui.com.wlylocationchoose.locationchoose.CityDataHelper;

public class MyApplication extends Application {
 private CityDataHelper dataHelper;
 @Override
 public void onCreate() {
 super.onCreate();
 
 dataHelper=CityDataHelper.getInstance(this);
 InputStream in = this.getResources().openRawResource(R.raw.city);
 dataHelper.copyFile(in,CityDataHelper.DATABASE_NAME,CityDataHelper.DATABASES_DIR);
 }
}

c. popupwindow不是本次的重点也直接贴代码。


 View popupView = LayoutInflater.from(this).inflate(R.layout.popup_locationchoose, null);
 mPopupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
 mPopupWindow.setTouchable(true);
 mPopupWindow.setFocusable(true);
 mPopupWindow.setOutsideTouchable(true);
 mPopupWindow.setAnimationStyle(R.style.popup_locationchoose_bottom);
 // pickText = (TextView)popupView.findViewById(R.id.tv_pickText);
 provinceView = (WheelView)popupView.findViewById(R.id.provinceView);
 cityView = (WheelView)popupView.findViewById(R.id.cityView);
 districtView = (WheelView)popupView.findViewById(R.id.districtView);
 //确定或者取消
 btn_myinfo_sure = (TextView)popupView.findViewById(R.id.btn_myinfo_sure);
 btn_myinfo_cancel = (TextView) popupView.findViewById(R.id.btn_myinfo_cancel);
 btn_myinfo_cancel.setOnClickListener(this);
 btn_myinfo_sure.setOnClickListener(this);

设置三个wheelview的可见条目数


provinceView.setVisibleItems(7);
cityView.setVisibleItems(7);
districtView.setVisibleItems(7);

为三个 wheelview添加滑动事件


 // 添加change事件
 provinceView.addChangingListener(this);
 // 添加change事件
 cityView.addChangingListener(this);
 // 添加change事件
 districtView.addChangingListener(this);

c. 拿到操作数据的对象sqliteDatabase


 db = dataHelper.openDataBase();

观察数据库文件可知这表中是根据字段level来判断省市区的,如图

这里写图片描述

同时我们也可知这省市区三个模型中的字段都是一样的,都是


 private int cityID;
 private int parentId;
 private int level;
 private String name;
 private String pinyin;

不清楚的可以自己查下表,如图,我查一个省

这里写图片描述

所以我们建立一样的模型,虽然三个字段是一样的,建一个就可以了,但是为了标准最好还是建三个。


package guozhaohui.com.wlylocationchoose.locationchoose.model;
public class ProvinceModel {
 private int cityID;
 private int parentId;
 private int level;
 private String name;
 private String pinyin;
 public int getCityID() {
 return cityID;
 }
 public void setCityID(int cityID) {
 this.cityID = cityID;
 }
 public int getParentId() {
 return parentId;
 }
 public void setParentId(int parentId) {
 this.parentId = parentId;
 }
 public int getLevel() {
 return level;
 }
 public void setLevel(int level) {
 this.level = level;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getPinyin() {
 return pinyin;
 }
 public void setPinyin(String pinyin) {
 this.pinyin = pinyin;
 }
}

进行sql查询,将查询到的结果保存在cursor中,然后进行一行行的循环遍历,然后将遍历一行的对象添加到这个对象的集合中。这里得到省的集合。


 public List<ProvinceModel> getProvice(SQLiteDatabase db){
 String sql="SELECT * FROM ChooseCityModel where level = 1 ORDER BY cityID";
 Cursor cursor = db.rawQuery(sql,null);
 List<ProvinceModel> list=new ArrayList<ProvinceModel>();
 if (cursor!=null&&cursor.getCount() > 0) {
 while (cursor.moveToNext()){
 ProvinceModel provinceModel=new ProvinceModel();
 provinceModel.setCityID(cursor.getInt(cursor.getColumnIndex("cityID")));
 provinceModel.setParentId(cursor.getInt(cursor.getColumnIndex("parentId")));
 provinceModel.setLevel(cursor.getInt(cursor.getColumnIndex("level")));
 provinceModel.setName(cursor.getString(cursor.getColumnIndex("name")));
 provinceModel.setPinyin(cursor.getString(cursor.getColumnIndex("pinyin")));
 list.add(provinceModel);
 }
 }
 return list;
 }

根据表的结构,得到相应的sql语句,希望根据上一级省的cityId得到下面的市,其实换句话说本级市的parentId就是上一级的cityid,不清楚的可以将sql语句查一遍,验证下对不对,如图

这里写图片描述

得到相应省下面市的集合


 public List<CityModel> getCityByParentId(SQLiteDatabase db, String code){
 String sql="SELECT * FROM ChooseCityModel WHERE level = 2 and parentId = ? ORDER BY cityID";
 Cursor cursor = db.rawQuery(sql,new String[][code]);
 List<CityModel> list=new ArrayList<CityModel>();
 if (cursor!=null&&cursor.getCount() > 0) {
 while (cursor.moveToNext()){
 CityModel cityModel=new CityModel();
 cityModel.setCityID(cursor.getInt(cursor.getColumnIndex("cityID")));
 cityModel.setParentId(cursor.getInt(cursor.getColumnIndex("parentId")));
 cityModel.setLevel(cursor.getInt(cursor.getColumnIndex("level")));
 cityModel.setName(cursor.getString(cursor.getColumnIndex("name")));
 cityModel.setPinyin(cursor.getString(cursor.getColumnIndex("pinyin")));
 list.add(cityModel);
 }
 }
 return list;
 }

区也是一样的,直接贴代码了


 public List<DistrictModel> getDistrictById(SQLiteDatabase db, String code){
 //注意这里的parentId其实就是上一级的cityID
 String sql="SELECT * FROM ChooseCityModel WHERE level = 3 and parentId = ? ORDER BY cityID";
 Cursor cursor = db.rawQuery(sql,new String[][code]);
 List<DistrictModel> list=new ArrayList<DistrictModel>();
 if (cursor!=null&&cursor.getCount() > 0) {
 while (cursor.moveToNext()){
 DistrictModel districtModel=new DistrictModel();
 districtModel.setCityID(cursor.getInt(cursor.getColumnIndex("cityID")));
 districtModel.setParentId(cursor.getInt(cursor.getColumnIndex("parentId")));
 districtModel.setLevel(cursor.getInt(cursor.getColumnIndex("level")));
 districtModel.setName(cursor.getString(cursor.getColumnIndex("name")));
 districtModel.setPinyin(cursor.getString(cursor.getColumnIndex("pinyin")));
 list.add(districtModel);
 }
 }
 return list;
 }

d. 对弹出popuwindow显示的wheelview进行初始化,注释都写在代码里,


 private void initpopData() {
 //初始化数据
 dataHelper = CityDataHelper.getInstance(this);
 db = dataHelper.openDataBase();
 provinceDatas = dataHelper.getProvice(db);
 if (provinceDatas.size() > 0) {
 //弹出popup时,省wheelview中当前的省其实就是省集合的第一个
 mCurrentProvince = provinceDatas.get(0).getName();
 //根据省cityid查询到第一个省下面市的集合
 cityDatas = dataHelper.getCityByParentId(db, provinceDatas.get(0).getCityID()+"");
 }
 if (cityDatas.size() > 0) {
 //根据市cityid查询到第一个市集合下面区的集合
 districtDatas = dataHelper.getDistrictById(db, cityDatas.get(0).getCityID()+"");
 }
 //wheelview的适配器代码
 provinceAdapter = new ProvinceAdapter(this, provinceDatas);
 provinceAdapter.setTextSize(TEXTSIZE);//设置字体大小
 provinceView.setViewAdapter(provinceAdapter);
 updateCitys();
 updateAreas();
 }

更新省下面市的wheelview内容,注释很清楚,直接上代码


 private void updateCitys() {
 int pCurrent = provinceView.getCurrentItem();
 if (provinceDatas.size() > 0) {
 //这里是必须的的,上面得到的集合只是第一个省下面所有市的集合及第一个市下面所有区的集合
 //这里得到的是相应省下面对应市的集合
 cityDatas = dataHelper.getCityByParentId(db, provinceDatas.get(pCurrent).getCityID()+"");
 } else {
 cityDatas.clear();
 }
 citysAdapter = new CitysAdapter(this, cityDatas);
 citysAdapter.setTextSize(TEXTSIZE);
 cityView.setViewAdapter(citysAdapter);
 if (cityDatas.size() > 0) {
 //默认省下面 市wheelview滑动第一个,显示第一个市
 cityView.setCurrentItem(0);
 mCurrentCity = cityDatas.get(0).getName();
 } else {
 mCurrentCity = "";
 }
 updateAreas();
 }

第三个wheelview和第二个一样的,代码直接上


 private void updateAreas() {
 int cCurrent = cityView.getCurrentItem();
 if (cityDatas.size() > 0) {
 districtDatas = dataHelper.getDistrictById(db, cityDatas.get(cCurrent).getCityID()+"");
 } else {
 districtDatas.clear();
 }
 areaAdapter = new AreaAdapter(this, districtDatas);
 areaAdapter.setTextSize(TEXTSIZE);
 districtView.setViewAdapter(areaAdapter);
 if (districtDatas.size() > 0) {
 mCurrentDistrict = districtDatas.get(0).getName();
 districtView.setCurrentItem(0);
 } else {
 mCurrentDistrict = "";
 }
 }

4. 道友留步

1).因为我朋友也是在网上哪里找到的demo,所以这原版是谁的也不知道了。
2). 源码地址这里点击

您可能感兴趣的文章:Android实现省市区三级联动最好用的Android省市区三级联动选择效果Android日期选择器实现年月日三级联动Android中使用开源框架Citypickerview实现省市区三级联动选择Android省市区三级联动控件使用方法实例讲解android-wheel控件实现三级联动效果Android使用android-wheel实现省市县三级联动Android实现三级联动下拉框 下拉列表spinner的实例代码Android PickerView实现三级联动效果


--结束END--

本文标题: Android自定义WheelView地区选择三级联动

本文链接: https://www.lsjlt.com/news/22095.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue自定义省市区三级联动
    本文实例为大家分享了Vue自定义省市区三级联动的具体代码,供大家参考,具体内容如下 1.如图(省市区加上全部联动) 第一步:找到了一个普通的省市区先进行遍历更改 2.把更改后的js...
    99+
    2024-04-02
  • Angularjs自定义指令如何实现三级联动选择地理位置
    这篇文章将为大家详细讲解有关Angularjs自定义指令如何实现三级联动选择地理位置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Angularjs自定义指令实现三级联动...
    99+
    2024-04-02
  • 如何在Android中使用WheelView实现三级联动
    这篇文章将为大家详细讲解有关如何在Android中使用WheelView实现三级联动,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。popupwindow中是三个wheelview,<&...
    99+
    2023-05-31
    android wheelview 三级联动
  • 利用级联选择器实现省市区三级联动【vue + elementUI Plus | uViewUI】
    文章目录 准备数据vue + ElementUI Plus 利用级联选择器实现省市区三级联动学习记录具体代码 vue + uViewUI 利用选择器多列联动实现省市区三级联动 (uniapp学习记录具体代码 准备数据 ...
    99+
    2023-08-19
    vue.js elementui javascript 小程序 前端
  • Jquery+Ajax+xml怎么实现中国地区选择三级联动菜单效果
    这篇文章给大家分享的是有关Jquery+Ajax+xml怎么实现中国地区选择三级联动菜单效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。<xml version...
    99+
    2024-04-02
  • js实现简单省市区三级选择联级
    本文实例为大家分享了js实现省市区三级选择联级的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang="en"&g...
    99+
    2024-04-02
  • 微信小程序实现地区选择伪五级联动
    本文实例为大家分享了微信小程序实现地区选择伪五级联动的具体代码,供大家参考,具体内容如下 效果图 这里采用的是自定义多列选择器picker mode="multiSele...
    99+
    2024-04-02
  • 怎么利用Ajax实现地区三级联动
    这篇文章主要介绍怎么利用Ajax实现地区三级联动,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言:利用Ajax来实现一个地区的三级联动,用Java代码来读json文件,先eclipse做一个简单的,最基础的。(js...
    99+
    2023-06-08
  • Android自定义ViewGroup实现选择面板
    目录背景效果思路完整代码使用背景 在做社交类平台开发的小伙伴都躲不开选择社交个性标签的业务需求,那么实现这个UI效果我想大伙第一时间想到的必定是RecycleView或GridVie...
    99+
    2024-04-02
  • Android自定义view实现滚动选择控件详解
    目录前言需求编写代码主要问题前言 上篇文章通过一个有header和footer的滚动控件(Viewgroup)学了下MeasureSpec、onMeasure以及onLayout,接...
    99+
    2022-11-13
    Android滚动选择 Android滚动选择控件 Android自定义view
  • Android自定义字母选择侧边栏
    本文实例为大家分享了Android自定义字母选择侧边栏的具体代码,供大家参考,具体内容如下 LetterSideBar.java package com.zb.customvie...
    99+
    2024-04-02
  • Android中怎么自定义选择控件
    本篇文章为大家展示了Android中怎么自定义选择控件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、自定义DialogDialog布局文件<xml version="1...
    99+
    2023-05-30
    android
  • 微信小程序中如何实现三级联动地址选择器
    这篇文章主要为大家展示了“微信小程序中如何实现三级联动地址选择器”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中如何实现三级联动地址选择器”这篇文章吧...
    99+
    2024-04-02
  • 微信小程序如何实现地区选择伪五级联动
    这篇文章主要介绍“微信小程序如何实现地区选择伪五级联动”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序如何实现地区选择伪五级联动”文章能帮助大家解决问题。效果图这里采用的是自定义多列选择器p...
    99+
    2023-07-02
  • 使用JavaScript怎么实现一个省市区三级选择联级
    这期内容当中小编将会给大家带来有关使用JavaScript怎么实现一个省市区三级选择联级,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点...
    99+
    2023-06-14
  • 微信小程序开发中如何实现三级联动地址选择器
    这篇文章将为大家详细讲解有关微信小程序开发中如何实现三级联动地址选择器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。picker和picker-view组件在正式介绍实现之前,我们需要先来介绍下这两个组件...
    99+
    2023-06-26
  • uniapp 使用 uni-data-picker级联选择器,自定义展示,uni小程序
    uniapp 使用 uni-data-picker级联选择器,多级选择,自定义展示 先看效果是不是你要的效果 页面组件 接口数据 jiduvalue:0,jidurange: [],data: [{year: '2022', valu...
    99+
    2023-12-23
    uni-app 小程序 vue.js javascript
  • layui中如何实现地区三级联动form select渲染
    这篇文章将为大家详细讲解有关layui中如何实现地区三级联动form select渲染,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。如下所示:html<!--&nb...
    99+
    2024-04-02
  • 微信小程序自定义滚动选择器
    本文实例为大家分享了微信小程序自定义滚动选择器的具体代码,供大家参考,具体内容如下 最近项目里有个需求要做个滚动选择器,在网上找了半天也没找到合适的demo,没办法只能发挥我的聪明才...
    99+
    2024-04-02
  • vue中怎么实现省市区三联动下拉选择组件
    这篇文章给大家分享的是有关vue中怎么实现省市区三联动下拉选择组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先来看一下最终的效果(没有写太多的样式...)组件所需要的省市区...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作