MVVM模式使用

MVVM模式使用

MVVM模式的优点

  1. 提供了数据和界面绑定的桥梁

MVVM模式的使用

  1. gradle在android节点下加入

    dataBinding {
      enabled true
    }
  2. 布局根节点加入layout

  3. 在activty中不再是setContentView 而是

    ​ DataBindingUtil.setContentView(this, R.layout.activity_main);

    会生成一个和布局文件名相同的ActivityMainBinding,此Binding携带有所有布局的id,和布局中的引用

  4. 对于一般情况而言逻辑代码都会写在Model里面,因为Binding携带有布局中所有的数据,方便的进行代码的分离

    <layout xmlns:tools="http://schemas.android.com/tools"
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
    >
       <data>
           <import type="android.view.View" />
           <variable
               name="user2"
               type="com.wang.mvvmuse.User2"
               />
           <variable
               name="imageUrl"
               type="String"
               />
           <variable
               name="viewModel"
               type="com.wang.mvvmuse.ViewModel"
               />
       </data>
       <LinearLayout
           android:orientation="vertical"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           >
    
           <TextView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text='@{user2.firstName}'
               app:layout_constraintBottom_toBottomOf="parent"
               app:layout_constraintLeft_toLeftOf="parent"
               app:layout_constraintRight_toRightOf="parent"
               app:layout_constraintTop_toTopOf="parent" />
    
           <ImageView
               app:image = "@{imageUrl}"
               android:layout_width="match_parent"
               android:layout_height="match_parent"
               android:onClick="@{viewModel.onClick}"
            />
    
       </LinearLayout>
    </layout>

    这里需要一个User2的bean类

    firstName 发生变化的时候 代码中的TextView也会发生相应的改变 ,这个就是MVVM的向下通知ObservableFilde

    public class User2 {
       public final ObservableField<String> firstName = new ObservableField<>();
    }
    final User2 user2 = new User2();
    binding.setUser2(user2);
    user2.firstName.set("text");
    new Handler().postDelayed(new Runnable() {
       @Override
       public void run() {
             user2.firstName.set("123456");          
          }
       }, 3000);
  5. 图片的加载,需要设置adapter

    public class ImageUtils {
       @BindingAdapter({"image"})
       public static void imageLoader(ImageView view,String url){
           Picasso.with(App.context).load(url)
                   .error(R.mipmap.ic_launcher)
                   .into(view);
       }
    }
  6. 设置点击事件

    上图xml中的android:onClick=”@{viewModel.onClick}”会调用这里的点击事件

    public class ViewModel {
       public void onClick(View view){
           Toast.makeText(view.getContext(),"点击事件", Toast.LENGTH_LONG).show();
       }
    }
  7. 注意事项

    xml 中不能有中文,否则编译通不过

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值