0
点赞
收藏
分享

微信扫一扫

浅谈MVVM之DataBinding-陈琪-123012016072

sunflower821 2022-04-21 阅读 40

<variable

name=“goods”

type=“Goods”/>

<variable

name=“goodsHandle”

type=“GoodsHandler”/>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”

android:padding=“20dp”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{goods.name}”/>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{goods.details}” />

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{String.valueOf(goods.price)}” />

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“@{(->goodsHandle.changeGoodsName())}”

android:text=“@string/change_name_price”

android:textAllCaps=“false”/>

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“@{()->goodsHandler.changeGoodsDetails()}”

android:text=“@string/change_details_price”

android:textAllCaps=“false” />

3、新的活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.databinding.Observable;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import com.example.c7.databindingtest.databinding.ActivityMain2Binding;

import com.example.c7.databindingtest.model.Goods;

import java.util.Random;

public class Main2Activity extends AppCompatActivity {

private Goods goods;

private static final String TAG = “Main2Activity”;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain2Binding activityMain2Binding= DataBindingUtil.setContentView(this,R.layout.activity_main2);

goods=new Goods(“yili”,“milk”,5);

activityMain2Binding.setGoods(goods);

activityMain2Binding.setGoodsHandler(new GoodsHandler());

goods.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {

@Override

public void onPropertyChanged(Observable sender, int propertyId) {

if (propertyId==BR.name){

Log.e(TAG, “BR.name”);

} else if (propertyId == BR.details) {

Log.e(TAG, “BR.details”);

} else if (propertyId == BR._all) {

Log.e(TAG, “BR._all”);

} else {

Log.e(TAG, “未知”);

}

}

});

}

public class GoodsHandler{

public void changeGoodsName(){

goods.setName(“yili”+new Random().nextInt(100));

goods.setPrice(new Random().nextInt(100));

}

public void changeGoodsDetails() {

goods.setDetails(“hi” + new Random().nextInt(100));

goods.setPrice(new Random().nextInt(100));

}

}

}

运行截图:

(1)

在这里插入图片描述

(2)点击“改变属性name和price”按钮

在这里插入图片描述

(3)点击“改变属性details和price”按钮

在这里插入图片描述

可以看到,name 视图的刷新没有同时刷新 price 视图,而 details 视图刷新的同时也刷新了 price 视图

实现了 Observable 接口的类允许注册一个监听器,当可观察对象的属性更改时就会通知这个监听器,此时就需要用到 OnPropertyChangedCallback

当中 propertyId 就用于标识特定的字段

goods.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {

@Override

public void onPropertyChanged(Observable sender, int propertyId) {

if (propertyId==BR.name){

Log.e(TAG, “BR.name”);

} else if (propertyId == BR.details) {

Log.e(TAG, “BR.details”);

} else if (propertyId == BR._all) {

Log.e(TAG, “BR._all”);

} else {

Log.e(TAG, “未知”);

}

}

});

(2)ObservableField

继承于 Observable 类相对来说限制有点高,且也需要进行 notify 操作,因此为了简单起见可以选择使用 ObservableField。ObservableField 可以理解为官方对 BaseObservable 中字段的注解和刷新等操作的封装,官方原生提供了对基本数据类型的封装,例如 ObservableBoolean、ObservableByte、ObservableChar、ObservableShort、ObservableInt、ObservableLong、ObservableFloat、ObservableDouble 以及 ObservableParcelable ,也可通过 ObservableField 泛型来申明其他类型

1、新的model

package com.example.c7.databindingtest.model;

import android.databinding.ObservableField;

import android.databinding.ObservableFloat;

/**

  • Created by c7 on 2019/5/30.

*/

public class ObservableGoods {

private ObservableField name;

private ObservableField details;

private ObservableFloat price;

public ObservableGoods(String name,String details,float price){

this.name=new ObservableField<>(name);

this.details = new ObservableField<>(details);

this.price=new ObservableFloat(price);

}

public ObservableField getName(){

return name;

}

public void setName(ObservableField name) {

this.name = name;

}

public ObservableField getDetails() {

return details;

}

public void setDetails(ObservableField details) {

this.details = details;

}

public ObservableFloat getPrice() {

return price;

}

public void setPrice(ObservableFloat price) {

this.price = price;

}

}

对 ObservableGoods 属性值的改变都会立即触发 UI 刷新,概念上与 Observable 区别不大,具体效果可看下面提供的源代码,这里不再赘述

2、布局文件

<?xml version="1.0" encoding="utf-8"?>

<variable

name=“observableGoods”

type=“ObservableGoods” />

<variable

name=“observableGoodsHandler”

type=“ObservableGoodsHandler” />

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”

android:padding=“20dp”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{observableGoods.name}” />

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{String.valueOf(observableGoods.price)}” />

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{observableGoods.details}” />

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“@{()->observableGoodsHandler.changeGoodsName()}”

android:text=“改变属性 name 和 price”

android:textAllCaps=“false” />

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“@{()->observableGoodsHandler.changeGoodsDetails()}”

android:text=“改变属性 details 和 price”

android:textAllCaps=“false” />

3、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.example.c7.databindingtest.databinding.ActivityMain3Binding;

import com.example.c7.databindingtest.model.ObservableGoods;

import java.util.Random;

public class Main3Activity extends AppCompatActivity {

private ObservableGoods observableGoods;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain3Binding activityMain3Binding= DataBindingUtil.setContentView(this,R.layout.activity_main3);

observableGoods=new ObservableGoods(“HUAWEI”,“telephone”,5000);

activityMain3Binding.setObservableGoods(observableGoods);

activityMain3Binding.setObservableGoodsHandler(new ObservableGoodsHandler());

}

public class ObservableGoodsHandler{

public void changeGoodsName() {

observableGoods.getName().set(“kangshifu” + new Random().nextInt(100));

}

public void changeGoodsDetails() {

observableGoods.getDetails().set(“water” + new Random().nextInt(100));

}

}

}

运行截图:

(1)

在这里插入图片描述

(2)点击“改变属性name和price”按钮

在这里插入图片描述

(3)点击“改变属性details和price”按钮

在这里插入图片描述

(3)ObservableCollection

dataBinding 也提供了包装类用于替代原生的 List 和 Map,分别是 ObservableList 和 ObservableMap,当其包含的数据发生变化时,绑定的视图也会随之进行刷新

1、布局文件

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”>

<variable

name=“list”

type=“ObservableList<String>”/>

<variable

name=“map”

type=“ObservableMap<String,String>”/>

<variable

name=“index”

type=“int”/>

<variable

name=“key”

type=“String”/>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:padding=“20dp”

android:text=“@{list[index]}”/>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_marginTop=“20dp”

android:padding=“20dp”

android:text=“@{map[key]}”/>

<Button

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:onClick=“onClick”

android:text=“@string/changeData”/>

2、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.databinding.ObservableArrayList;

import android.databinding.ObservableArrayMap;

import android.databinding.ObservableList;

import android.databinding.ObservableMap;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import com.example.c7.databindingtest.databinding.ActivityMain4Binding;

import java.util.Random;

public class Main4Activity extends AppCompatActivity {

private ObservableMap<String,String> map;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain4Binding activityMain4Binding= DataBindingUtil.setContentView(this,R.layout.activity_main4);

map=new ObservableArrayMap<>();

map.put(“name”,“chenqi”);

map.put(“age”,“21”);

activityMain4Binding.setMap(map);

ObservableList list=new ObservableArrayList<>();

list.add(“chen”);

list.add(“qi”);

activityMain4Binding.setList(list);

activityMain4Binding.setIndex(0);

activityMain4Binding.setKey(“name”);

}

public void onClick(View view){

map.put(“name”,“chenqi,hi”+new Random().nextInt(100));

}

}

运行截图:

(1)

在这里插入图片描述

(2)点击“改变数据”按钮

在这里插入图片描述

[](()三、双向数据绑定

单向绑定和双向绑定的区别,以及双向绑定的好处:

更详细的在:[https://www.jianshu.com/p/e8b6ba90de53](()

双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据

举个简单的例子:

需求 Android开源项目《ali1024.coding.net/public/P7/Android/git》 :界面上有两个控件,EditText 用于获取用户输入,TextView 用于把用户输入展示出来。

传统方式的实现

①需要定义一个布局,设置好这两个控件,

②然后在代码中引用这个布局,获取这两个控件的对象,然后添加监听器对象到 EditText 上,③在输入发生变化的时候,获取输入,最后赋值给TextView做显示

需要写三步。

接下来会涉及上面简单例子的实现,读者可以加以对比,体会DataBinding与传统的不同。

看以下例子:

①databinding的方法是当 EditText 的输入内容改变时,会同时同步到变量 goods,绑定变量的方式比单向绑定多了一个等号:android:text=“@={[goods.name](()}”

②然后在活动类里只需要把对象绑定进去就好了

1、布局文件

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:app=“http://schemas.android.com/apk/res-auto”

xmlns:tools=“http://schemas.android.com/tools”>

<variable

name=“goods”

type=“ObservableGoods”/>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<TextView

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@{goods.name}”/>

<EditText

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:text=“@={goods.name}”/>

2、活动

package com.example.c7.databindingtest;

import android.databinding.DataBindingUtil;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import com.example.c7.databindingtest.databinding.ActivityMain5Binding;

import com.example.c7.databindingtest.model.ObservableGoods;

public class Main5Activity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain5Binding activityMain5Binding= DataBindingUtil.setContentView(this,R.layout.activity_main5);

ObservableGoods goods=new ObservableGoods(“glass”,“cup”,20);

activityMain5Binding.setGoods(goods);

}

}

最后

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。

也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。

我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料

部分文件:


import com.example.c7.databindingtest.databinding.ActivityMain5Binding;

import com.example.c7.databindingtest.model.ObservableGoods;

public class Main5Activity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMain5Binding activityMain5Binding= DataBindingUtil.setContentView(this,R.layout.activity_main5);

ObservableGoods goods=new ObservableGoods(“glass”,“cup”,20);

activityMain5Binding.setGoods(goods);

}

}

最后

上面这些公司都是时下最受欢迎的互联网大厂,他们的职级、薪资、福利也都讲的差不多了,相信大家都是有梦想和野心的人,心里多少应该都有些想法。

也相信很多人也都在为即将到来的金九银十做准备,也有不少人的目标都是这些公司。

我这边有不少朋友都在这些厂工作,其中也有很多人担任过面试官,上面的资料也差不多都是从朋友那边打探来的。除了上面的信息,我这边还有这些大厂近年来的面试真题及解析,以及一些朋友出于兴趣和热爱一起整理的Android时下热门知识点的学习资料

部分文件:
[外链图片转存中…(img-EHCwncuF-1650450553754)]
[外链图片转存中…(img-JJ3ZoDFx-1650450553755)]
[外链图片转存中…(img-baQe9dY9-1650450553755)]

举报

相关推荐

0 条评论