Android DataBinding实现地址三联动

来源:互联网 发布:ps名片源码 编辑:程序博客网 时间:2024/06/04 19:37

这篇文章主要是写关于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 Layout10      */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  @Override10 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的好处。

0 0
原创粉丝点击