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 }
然后,抽象一个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 }
注释写的比较明确了,在视图实现类上,大家还可以根据自己的需要,再添加一些方法,利用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 }
可以看到,这块在点击时,弹出下拉列表,那么弹出显示的位置方法,也已经标出了注释,主要的数据写入方式就是set方法,那么这个set方法其实映射的就是个实体类,只需要将实体类定义好,然后可以直接将数据写进去,就算跳转到别的页面,这个数据也不会丢失,更不需要将数据写入内存当中,然后在读取,大大的方便了使用。
不得不说,DataBinding的出现,大大的缩减了代码的行数,很多逻辑不需要想太多就能实现,大大的提高了工作效率。这里也只是简单的介绍了一些东西的实现方式,想具体了解的童鞋,可以到文章开头给出的地址去下载这个Demo,代码中都有详细的注释。希望可以帮助更多的人去认识DataBinding的好处。