Android DataBinding实现地址三联动
这篇文章主要是写关于Android实现地址三联动的功能,现在附上demo地址:https://github.com/qiuyueL/NewAddressDemo,里面会有详细的注释,以及控件的使用,其中还包括了一个PopupWindow的封装。先简单说一下PopupWindow的封装以及使用。
首先,先搭建一个PopupWindow视图的实现类,主要是实现一个通过泛型获取findViewById资源文件,直接通过ID来操作其中的事件方法,可以省略一个ID的注册步骤,先上一个跟目标demo相关的部分源码:
/**
* 操作PopupWindow视图的实现类
* Created by LQY on 2016/10/19.
*/
public class PopupViewHolder {
/**
* PopupWindow View
*/
View mPopupView; public PopupViewHolder(View view){
mPopupView = view;
} /**
* 通过泛型获取findViewById资源文件
*/
public final <T extends View> T getView(int viewId){
return (T) mPopupView.findViewById(viewId);
} public void setOnItemClickListener(int viewId, AdapterView.OnItemClickListener listener){
AdapterView view = getView(viewId);
view.setOnItemClickListener(listener);
} public void setArrayAdapter(int viewId, ArrayAdapter adapter){
ListView view = getView(viewId);
view.setAdapter(adapter);
}
}
然后,抽象一个PopupWindow弹出对话框的类,代码如下:
/**
* PopupWindow弹出对话框抽象类
* Created by LQY on 2016/10/19.
*/
public abstract class CommonPopupWindow extends PopupWindow { private Activity mActivity;
/**
* popup Layout
*/
private View mPopupView; private int mPopupLayoutId;
/**
* PopupView实现类
*/
PopupViewHolder popupView; public CommonPopupWindow(Activity activity, int LayoutId){
mActivity = activity;
mPopupLayoutId = LayoutId;
} /**
* 绑定布局资源
*/
private void getPopupView(){
mPopupView = LayoutInflater.from(mActivity).inflate(mPopupLayoutId,null);
popupView = new PopupViewHolder(mPopupView);
showWindow(popupView);
setContentView(mPopupView);
} /**
* 弹出下拉列表
*/
public void listPopup(View view){
getPopupView();
setWidth(view.getWidth() + 5);
setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
ColorDrawable dw = new ColorDrawable(Color.WHITE);
setBackgroundDrawable(dw);
setOutsideTouchable(true);
setFocusable(true);
showAsDropDown(view);
} /**
* 弹出对话框以后
*/
protected abstract void showWindow(PopupViewHolder view);
}
注释写的比较明确了,在视图实现类上,大家还可以根据自己的需要,再添加一些方法,利用setText(),setBackgroundResource()等部分方法,里面的参数,以及方法体,可以模仿其中的来写,很容易。Demo里面有详细的代码,大家可以下载下来看看。
接下来,就是主要的地方,即如何利用DataBinding实现地址联动,和封装的PopupWindow如何使用。至于地址的Json解析在源码中都有注释,这里不做详细的讲解,就一概而过,现在很多的教程都在讲地址联动,可以只需要把解析那块用起来,也可以用我这个解析,不过我觉得我这个解析稍微复杂了点,因为需要根据索引值,来判定每一次选取的值,其实原理不难理解,就是在写的时候,可能是绕的比较多,需要做循环来取值。我这个解析也是参照了别人的方法,然后把需要的地方自己改了改。这里就不在赘述,有需要的可以下载源码看看,里面有详细的注释。现在说说封装的PopupWindow的使用,先上一段代码:
//弹出省列表
private void ProvincePopup() {
mProvinceAdapter = new ArrayAdapter<String>(this,R.layout.popuwindow_lv_item,mProvinceDatas);
CommonPopupWindow mProvinceDialogue = new CommonPopupWindow(this, R.layout.posting_listview) {
@Override
protected void showWindow(PopupViewHolder popupView) {
popupView.setArrayAdapter(R.id.posting_list, mProvinceAdapter);
popupView.setOnItemClickListener(R.id.posting_list, new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
//将省的全部数据写入实体类中
bean.setProvince(mProvinceDatas[position]);
binding.setAddress(bean);
//关闭列表
dismiss();
//根据选出的省更新市级的数据
updateCity(mProvinceDatas[position]);
}
});
}
};
//根据控件显示列表出现的位置
mProvinceDialogue.listPopup(binding.provinceEdit);
}
private void updateCity(String pro){
mCityDatas = mCitiesMap.get(pro);
for (int i = 0;i < mCityDatas.length;i++){
mCityAdapter = new ArrayAdapter<String>(this,R.layout.popuwindow_lv_item,mCityDatas);
mCityAdapter.notifyDataSetChanged();
}
}
可以看到,这块在点击时,弹出下拉列表,那么弹出显示的位置方法,也已经标出了注释,主要的数据写入方式就是set方法,那么这个set方法其实映射的就是个实体类,只需要将实体类定义好,然后可以直接将数据写进去,就算跳转到别的页面,这个数据也不会丢失,更不需要将数据写入内存当中,然后在读取,大大的方便了使用。
不得不说,DataBinding的出现,大大的缩减了代码的行数,很多逻辑不需要想太多就能实现,大大的提高了工作效率。这里也只是简单的介绍了一些东西的实现方式,想具体了解的童鞋,可以到文章开头给出的地址去下载这个Demo,代码中都有详细的注释。希望可以帮助更多的人去认识DataBinding的好处。
Android DataBinding实现地址三联动的更多相关文章
- Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android Studio系列教程三--快捷键
Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...
- 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ A2DP.SINK.sink_connect.s ...
- 【转】android 电容屏(三):驱动调试之驱动程序分析篇
关键词:android 电容屏 tp 工作队列 中断 坐点计算 电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310( ...
- Android Sip学习(三)Android Voip实现
Android Sip学习(三)Android Voip实现 Android Sip学习(准备知识)SIP 协议完整的呼叫流程 Android Sip学习(一)Android 2.3 APIs S ...
- Android Studio 下载地址【包括国内本地下载】
Android Studio 下载地址,目前最新可下载地址,尽量使用下载工具. Android Studio正式发布,给Android开发者带来了不小的惊喜.但是下载地址却不给力,国内似乎无法正常下载 ...
- 设计模式笔记之三:Android DataBinding库(MVVM设计模式)
本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236908&idx=1&sn=9e53 ...
随机推荐
- opencv学习笔记2
import cv2 as cvimport numpy as np"""#图像加法运算 即像素加法 (结果图=图1+图二) (两个图像必须是等大等类型的)image = ...
- 数据结构54:平衡二叉树(AVL树)
上一节介绍如何使用二叉排序树实现动态查找表,本节介绍另外一种实现方式——平衡二叉树. 平衡二叉树,又称为 AVL 树.实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 ...
- SLAM技术在国内的发展现状
近年来,由于扫地机的出现使得SLAM技术名声大噪,如今,已在机器人.无人机.AVG等领域相继出现它的身影,今天就来跟大家聊一聊国内SLAM的发展现状. SLAM的多领域应用 SLAM应用领域广泛,按其 ...
- 洛谷P2679 子串
放题解 题目传送门 放代码
- shell-001:记录每天的磁盘情况
# shell-100只是为了练习!!适合新手! #!/bin/bash # 此脚本是记录每天的磁盘情况,记录保存30天! # 当前的日期 current_time=$(date +%F) # 保存的 ...
- ELK (Elasticsearch , Logstash, Kibana [+FileBeat])
ELK 简述: ELK 是: Elasticsearch , Logstash, Kibana 简称, 它们都是开源软件. Elasticsearch[搜索]是个开源分布式基于Lucene的搜索引擎, ...
- 24个常用 Python 实现
24个常用 Python 实现 1.冒泡排序 lis = [56,12,1,8,354,10,100,34,56,7,23,456,234,-58] def sortport(): for i in ...
- 【算法笔记】B1008 数组元素循环右移问题
1008 数组元素循环右移问题 (20 分) 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN ...
- 权限管理系统源码分析(ASP.NET MVC 4.0 + easyui + EF6.0 + MYSQL/MSSQLSERVER +微软企业库5.0+日志绶存)
系统采用最先进技术开发: (ASP.NET MVC 4.0 + easyui + EF6.0 + MYSQL/MSSQLSERVER +微软企业库5.0+日志绶存) 大家可以加我QQ讨论 309159 ...
- Go 语言 基础 【第一篇】:package fmt导入
package main 解释:只要你 一个可执行 程序