这篇文章主要是写关于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实现地址三联动的更多相关文章

  1. Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具

    Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...

  2. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

  3. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  4. Android Studio系列教程三--快捷键

    Android Studio系列教程三--快捷键 2014 年 12 月 09 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzhang.com/ ...

  5. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  6. 【转】android 电容屏(三):驱动调试之驱动程序分析篇

    关键词:android  电容屏 tp 工作队列 中断 坐点计算  电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0  平台:S5PV310( ...

  7. Android Sip学习(三)Android Voip实现

    Android Sip学习(三)Android Voip实现   Android Sip学习(准备知识)SIP 协议完整的呼叫流程 Android Sip学习(一)Android 2.3 APIs S ...

  8. Android Studio 下载地址【包括国内本地下载】

    Android Studio 下载地址,目前最新可下载地址,尽量使用下载工具. Android Studio正式发布,给Android开发者带来了不小的惊喜.但是下载地址却不给力,国内似乎无法正常下载 ...

  9. 设计模式笔记之三:Android DataBinding库(MVVM设计模式)

    本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236908&idx=1&sn=9e53 ...

随机推荐

  1. P2045 方格取数加强版 最大费用最大流

    $ \color{#0066ff}{ 题目描述 }$ 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每 ...

  2. ionic4 添加自定义字体图标

    在angular.json中的style中引入css文件: 然后在variables.scss中添加内容:

  3. 移动像素的px ,dp/pt,dpr的关系

    一:基础知识 px:逻辑像素,浏览器使用的抽象单位 dp,pt:设备无关像素 也叫物理像素 dpr:devicePixelRatio 设备像素缩放比 计算公式:1px=(dpr)^2*dp; ipho ...

  4. angular-ui-select 下拉框支持过滤单选多选解决方案(系列一)

    angular-ui-select  官方文档:github地址:https://github.com/angular-ui/ui-select 请大家多看文档     首先注意版本的问题,如果版本不 ...

  5. redux超易学三篇之一(单独说redux)

    redux其实非常简单.当复杂的步骤被拆分,其实每一步都是很容易的. Github: 完整代码链接 本文在 create-react-app 中的 index.js 随便引入了一下. (其实不必如此. ...

  6. python之time和datetime的常用方法

    python之time和datetime的常用方法   一.time的常用方法: import time,datetime # 时间有三种展现方式:时间戳,时间元组,格式化的时间print(time. ...

  7. Android RecyclerView组件和 Spinner(下拉列表框)

    1.RecyclerView <1>知识点介绍 RecyclerView 比 ListView 更高级且更具灵活性. 它是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效 ...

  8. 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)

    1.TabLayout介绍 TabLayout提供了一个水平的布局用来展示Tabs,很多应用都有这样的设计,典型的有网易新闻,简书,知乎等.TabLayout就可以很好的完成这一职责,首先TabLay ...

  9. springboot(五)-使用Redis

    Redis服务器 springboot要使用redis,首先当然要确保redis服务器能够正常跑起来. pom.xml 这里添加redis的依赖,当然也是springboot集成好的. <!-- ...

  10. SpringMVC 商城项目

    1.  商城视频中有word   笔记文档