zoukankan      html  css  js  c++  java
  • 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的好处。

  • 相关阅读:
    标识符
    注释
    关键字
    第一个JAVA程序
    JAVA运行机制
    每个程序员都应该知道的延迟数
    构建WebDriverAgent时报错“xxx: no identity found Command CodeSign failed with a nonzero exit code”解决办法
    执行 sh ./Scripts/bootstrap.sh -d 时提示“xcrun: error: unable to find utility “simctl”, not a developer tool or in PATH ”错误解决办法
    stf ios版本部署
    centos 7安装一机多控stf客户端
  • 原文地址:https://www.cnblogs.com/liuqiuyue/p/6008558.html
Copyright © 2011-2022 走看看