Android DataBinding实现地址三联动

这篇文章主要是写关于Android实现地址三联动的功能,现在附上demo地址:https://github.com/qiuyueL/NewAddressDemo,里面会有详细的注释,以及控件的使用,其中还包括了一个PopupWindow的封装。先简单说一下PopupWindow的封装以及使用。

首先,先搭建一个PopupWindow视图的实现类,主要是实现一个通过泛型获取findViewById资源文件,直接通过ID来操作其中的事件方法,可以省略一个ID的注册步骤,先上一个跟目标demo相关的部分源码:

 1 /**
 2  * 操作PopupWindow视图的实现类
 3  * Created by LQY on 2016/10/19.
 4  */
 5 public class PopupViewHolder {
 6     /**
 7      * PopupWindow View
 8      */
 9     View mPopupView;
10 
11     public PopupViewHolder(View view){
12         mPopupView = view;
13     }
14 
15     /**
16      * 通过泛型获取findViewById资源文件
17      */
18     public final <T extends View> T getView(int viewId){
19         return (T) mPopupView.findViewById(viewId);
20     }
21 
22     public void setOnItemClickListener(int viewId, AdapterView.OnItemClickListener listener){
23         AdapterView view = getView(viewId);
24         view.setOnItemClickListener(listener);
25     }
26 
27     public void setArrayAdapter(int viewId, ArrayAdapter adapter){
28         ListView view = getView(viewId);
29         view.setAdapter(adapter);
30     }
31 }
View Code

然后,抽象一个PopupWindow弹出对话框的类,代码如下:

 1 /**
 2  * PopupWindow弹出对话框抽象类
 3  * Created by LQY on 2016/10/19.
 4  */
 5 public abstract class CommonPopupWindow extends PopupWindow {
 6 
 7     private Activity mActivity;
 8     /**
 9      * popup Layout
10      */
11     private View mPopupView;
12 
13     private int mPopupLayoutId;
14     /**
15      * PopupView实现类
16      */
17     PopupViewHolder popupView;
18 
19     public CommonPopupWindow(Activity activity, int LayoutId){
20         mActivity = activity;
21         mPopupLayoutId = LayoutId;
22     }
23 
24     /**
25      * 绑定布局资源
26      */
27     private void getPopupView(){
28         mPopupView = LayoutInflater.from(mActivity).inflate(mPopupLayoutId,null);
29         popupView = new PopupViewHolder(mPopupView);
30         showWindow(popupView);
31         setContentView(mPopupView);
32     }
33 
34     /**
35      * 弹出下拉列表
36      */
37     public void listPopup(View view){
38         getPopupView();
39         setWidth(view.getWidth() + 5);
40         setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
41         ColorDrawable dw = new ColorDrawable(Color.WHITE);
42         setBackgroundDrawable(dw);
43         setOutsideTouchable(true);
44         setFocusable(true);
45         showAsDropDown(view);
46     }
47 
48     /**
49      * 弹出对话框以后
50      */
51     protected abstract void showWindow(PopupViewHolder view);
52 }
View Code

注释写的比较明确了,在视图实现类上,大家还可以根据自己的需要,再添加一些方法,利用setText(),setBackgroundResource()等部分方法,里面的参数,以及方法体,可以模仿其中的来写,很容易。Demo里面有详细的代码,大家可以下载下来看看。

接下来,就是主要的地方,即如何利用DataBinding实现地址联动,和封装的PopupWindow如何使用。至于地址的Json解析在源码中都有注释,这里不做详细的讲解,就一概而过,现在很多的教程都在讲地址联动,可以只需要把解析那块用起来,也可以用我这个解析,不过我觉得我这个解析稍微复杂了点,因为需要根据索引值,来判定每一次选取的值,其实原理不难理解,就是在写的时候,可能是绕的比较多,需要做循环来取值。我这个解析也是参照了别人的方法,然后把需要的地方自己改了改。这里就不在赘述,有需要的可以下载源码看看,里面有详细的注释。现在说说封装的PopupWindow的使用,先上一段代码:

 1     //弹出省列表
 2     private void ProvincePopup() {
 3         mProvinceAdapter = new ArrayAdapter<String>(this,R.layout.popuwindow_lv_item,mProvinceDatas);
 4         CommonPopupWindow mProvinceDialogue = new CommonPopupWindow(this, R.layout.posting_listview) {
 5             @Override
 6             protected void showWindow(PopupViewHolder popupView) {
 7                 popupView.setArrayAdapter(R.id.posting_list, mProvinceAdapter);
 8                 popupView.setOnItemClickListener(R.id.posting_list, new AdapterView.OnItemClickListener() {
 9                     @Override
10                     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
11                         //将省的全部数据写入实体类中
12                         bean.setProvince(mProvinceDatas[position]);
13                         binding.setAddress(bean);
14                         //关闭列表
15                         dismiss();
16                         //根据选出的省更新市级的数据
17                         updateCity(mProvinceDatas[position]);
18                     }
19                 });
20             }
21         };
22         //根据控件显示列表出现的位置
23         mProvinceDialogue.listPopup(binding.provinceEdit);
24     }
25     private void updateCity(String pro){
26         mCityDatas = mCitiesMap.get(pro);
27         for (int i = 0;i < mCityDatas.length;i++){
28             mCityAdapter = new ArrayAdapter<String>(this,R.layout.popuwindow_lv_item,mCityDatas);
29             mCityAdapter.notifyDataSetChanged();
30         }
31     }
View Code

可以看到,这块在点击时,弹出下拉列表,那么弹出显示的位置方法,也已经标出了注释,主要的数据写入方式就是set方法,那么这个set方法其实映射的就是个实体类,只需要将实体类定义好,然后可以直接将数据写进去,就算跳转到别的页面,这个数据也不会丢失,更不需要将数据写入内存当中,然后在读取,大大的方便了使用。

不得不说,DataBinding的出现,大大的缩减了代码的行数,很多逻辑不需要想太多就能实现,大大的提高了工作效率。这里也只是简单的介绍了一些东西的实现方式,想具体了解的童鞋,可以到文章开头给出的地址去下载这个Demo,代码中都有详细的注释。希望可以帮助更多的人去认识DataBinding的好处。

原文地址:https://www.cnblogs.com/liuqiuyue/p/6008558.html