Android应用开发Android MVVM架构模式DataBinding框架解析
白羽 2019-01-14 来源 :网络 阅读 4186 评论 0

摘要:本文将带你了解Android应用开发Android MVVM架构模式DataBinding框架解析,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android MVVM架构模式DataBinding框架解析,希望本文对大家学Android有所帮助。


Android   MVVM架构模式DataBinding框架解析。
   
    一 表达式
    支持的表达式:
    数学计算 + - / * %
   
    字符串连接 +
   
    逻辑 && ||
   
    二进制 & | ^
   
    一元运算符 + - ! ~
   
    位移 >> >>> <<
   
    比较 == > < >= <=
   
    instanceof
   
    组 ()
   
    文字 - 字符,字符串,数字, null
   
    类型转换
   
    函数调用
   
    字段存取
   
    数组存取 []
   
    三目运算符 ?:
   
    如:
    数组存取 []
   
    ?
    1
    2
    3
    <variable name="list"   type="List<String>">
     <variable name="index"   type="int">
      android:text="@{list[index]}"</variable></variable>
    三目运算符 ?:
   
    ?
    1
    android:visibility="@{id>5 ? View.GONE : View.VISIBLE}"
    资源引用:
   
    ?
    1
    2
    @{@string/name}
    @{@drawable/fengjing1}
    不支持的表达式:
   
    this
   
    super
   
    new
   
    二 数组使用
    这里的实例是RecyclerView中的每个Item,有9张图,然后让这9张图Biding
   
    1 创建variable
   
    ?
    1
    2
    3
    <variable name="position" type="int">
     
        <variable   name="ninePictureArray" type="String[][]"></variable></variable>
    2 ImageView中引用
   
    ?
    1
    2
    3
    app:imageUrl="@{ninePictureArray[position][0]}"
    app:imageUrl="@{ninePictureArray[position][1]}"
    ...
    position是第几个Item的标记,后面的数字是第几张图片
   
    3 再用binding去set值
    这里是在Adapter中
   
    ?
    1
    2
    3
    4
    5
    void bindItem(final int bindPosition{
    mItemLayoutBinding.setItemViewModel(aItemViewModel);
    mItemLayoutBinding.setNinePictureArray(mPicture);// 这里传入的是二维数组
    mItemLayoutBinding.setPosition(bindPosition);
      }
    传入二维数组mPicture和int的position的值(这里通过形参获取)
    这样XML的二维数组ninePictureArray就有了值,再在各个ImageView中去取不同位置的值
   
    三 DataBinding结合RecyclerView
   
    首先
   
    MAinActivity(也就是有RecyclerView)的地方
   
    ?
    1
    2
    3
    4
    //改写 setContentView 进行MainActivity和activity_main的连接
           ActivityMainBinding   activityMainBinding = DataBindingUtil.setContentView(this,   R.layout.activity_main);
           //通过ID去绑定XML的组件
           mRecyclerView =   activityMainBinding.recyclerView;
    再去ViewModel中加载数据
   
    ?
    1
    itemViewModel2.initData(MainActivity.this);
    加载布局管理器
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 加载布局管理器
            initView();
    private void initView() {
            mLayoutManager = new   LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
            //设置布局管理器
            mRecyclerView.setLayoutManager(mLayoutManager);
              //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
              mRecyclerView.setHasFixedSize(true);
            //设置adapter
              mRecyclerView.setAdapter(itemViewModel2.mAdapter);
            //添加分割线
              mRecyclerView.addItemDecoration(new ItemDivideLineView(
                    this,   DividerItemDecoration.VERTICAL));
        }
    在Adpater中:
    1 根据XML的名字编译过后的Databinding 见上方有讲解 创建对象
    在onCreateViewHolder中:
   
    ?
    1
    2
    3
    4
    5
    6
    // 传入itemViewModel给MyComponent
     // MyComponent.getObject3(aItemViewModel);
     // 这里还使用了ImageView 所以传入参数给 new   MyComponent()
     //   若只使用RecyclerView不使用ImageView,后面的newMyComponent() 可以删掉
    ItemLayoutBinding itemLayoutBinding =   DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),   R.layout.item_layout,parent, false,new MyComponent());
     return new   ViewHolder(itemLayoutBinding);
    2 onBindViewHolder中
   
    ?
    1
    2
    // 传过来的ArrayList 根据position绑定值      position为当前界面显示的item条目  从0开始   若有多个则调用多个 但是也是一个个按先后顺序的
    holder.bindItem(position);
    3 在ViewHolder class中:
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //声明:
        ItemLayoutBinding   mItemLayoutBinding;
        public   ViewHolder(ItemLayoutBinding itemLayoutBinding) {
              super(itemLayoutBinding.itemLayout);
            this.mItemLayoutBinding =   itemLayoutBinding;
        }
     
        void bindItem(final int   bindPosition){
            // 不是创建新的itemViewModel
            //ItemViewModel itemViewModel   = new ItemViewModel();
              aItemViewModel.setOtherPosition(bindPosition);
              mItemLayoutBinding.setItemViewModel(aItemViewModel);
              mItemLayoutBinding.setNinePictureArray(mPicture);
              mItemLayoutBinding.setPosition(bindPosition);
     
        }
    }
    四 DataBinding使用ImageView加载网络图片(这里是RecyclerView中的ImageView)
    XML中:
   
    ?
    1
    2
    3
    4
    // valiable 中
     <variable name="user"   type="包名.User类(Bean类)">
    //ImageView中
    app:imageUrl="@{ user.UserImage}"</variable>
    会调用方法getUserImage()
    java中:
   
    ?
    1
    2
    3
    4
    public URL getUserImage() throws MalformedURLException {
           URL url = new   URL(String类型的url);
           return url;
       }
    但是会出现一个问题,就是不识别app:的属性
    app:imageUrl=”@{ user.UserImage}”里的user.UserImage为绿色不是白色
    原因,这个app:imageUrl是自定义的XML方法,不是系统自带的,因此需要自定义方法设置
    解决:
    1
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @BindingAdapter("app:imageUrl")
    // 这里的函数名没有约束 编译时会根据上面的@注解进行绑定
     public void   loadImageForUrl(ImageView imageView, URL url) {
        }
     
    //也可以绑定多个
          @BindingAdapter({"app:imageUrl","error"})
        public void loadImageForUrl(ImageView   imageView, String url, Drawable error) {
              Log.i("setImageUrl", String.valueOf(url));
              Log.d("setImageUrl", "setImageUrl is Called");  
            //Glide的使用
        }
    //XML中
    app:imageUrl="@{itemViewModel.UserImage}"
    app:error="@{@drawable/fengjing1}"
    原理是:
    通过@注解,设置自定义的xml的方法,app:imageUrl的组件去调用这个方法 传入这个组件(如imageView) 所以不需要findID   再传入方法中的值,(可以是常量,也可以是databinding的变量)
   
    运行后会报错:
   
    ?
    1
    2
    java.lang.IllegalStateException: Required DataBindingComponent is null in   class ItemLayoutBinding.
    A BindingAdapter in com.scnu.sihao.sinaweibodemo.ViewModel.ItemViewModel is   not static and requires an object to use, retrieved from the   DataBindingComponent. If you don't use an inflation method taking a   DataBindingComponent, use DataBindingUtil.setDefaultComponent or make all   BindingAdapter methods static.                                                                                 at android.databinding.ViewDataBinding.ensureBindingComponentIsNotNull(ViewDataBinding.java:554)
    2 创建类implements DataBindingComponent
   
    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyComponent implements   android.databinding.DataBindingComponent{
       private static ItemViewModel   myItemViewModel;
        @Override
        public ItemViewModel   getItemViewModel() {
            return myItemViewModel;
        }
     
        public static void   getObject3(ItemViewModel itemViewModel){
              myItemViewModel=itemViewModel;
        }
     
    }
    3 在使用了app:imageUrl的xml对应的Activity或者Adapter中
    这里是Adapter
   
    ?
    1
    2
    3
    4
    5
    6
    //通过DataBindingUtil加载我们的布局文件
    //在这里我们实例化了一个我们定义的DataBindingComponent对象MyComponent
      //这个是非常关键的一个地方,否则系统会使用DataBindingUtil#getDefaultComponent()拿到的默认实例作为参数
              //如果我们在此之前没有调用DataBindingUtil.setDefaultComponent()方法,上面的方法就会返回null
    ItemLayoutBinding itemLayoutBinding =   DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),   R.layout.item_layout,
                    parent, false,n    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程