MVVM + dataBinding

2023-05-16

MVVM + dataBinding

mvvm模式不做过多讲解,参考下面文章或其他文章对mvvm描述
http://www.jianshu.com/p/6872b699879d

后面又发现一篇比较好的文章,补上
http://lib.csdn.net/article/android/57804?knId=295

引入 dataBinding

按网上部分文章的引入方式,会报如下错误

Error:(2, 1) A problem occurred evaluating project ':mvvm'.
> org/apache/commons/lang3/StringUtils

解决办法(基本现在as都是比较高的了,不够高自行升级下)
这里写图片描述
直接就可以引用了

简单示例1

1.布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <variable
            name="stu"
            type="com.wuhai.mvvm.Student" />
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{stu.name}"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{stu.addr}"/>
    </LinearLayout>
</layout>

2.model

package com.wuhai.mvvm;

/**
 * Created by wuhai on 2017/08/14 15:47.
 * 描述:
 */

public class Student {

    private String name;
    private String addr;

    public Student(String name, String addr) {
        this.name = name;
        this.addr = addr;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }
}

3.绑定view

package com.wuhai.mvvm;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.wuhai.mvvm.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        ActivityMainBinding binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.setStu(new Student("路飞","海贼王"));//model和布局绑定
    }
}

※ActivityMainBinding这个类是根据布局生成的

运行效果
这里写图片描述

简单示例2
a.传统findViewById +dataBinding
b.imageview绑定
c.修改Model后自动更新UI
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">
    <data>
        <variable
            name="stu"
            type="com.wuhai.mvvm.Student" />
    </data>
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{stu.name}"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{stu.addr}"/>
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:photo="@{stu.photo}"/>
        <Button
            android:id="@+id/btn01"
            android:text="更新信息"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/name"
            android:layout_width="100dp"
            android:layout_height="wrap_content" />
        <EditText
            android:id="@+id/addr"
            android:layout_width="100dp"
            android:layout_height="wrap_content" />
    </LinearLayout>
</layout>

a.可以给控件增加id
b.图片要使用自定义属性
2.model

package com.wuhai.mvvm;

import android.databinding.BaseObservable;
import android.databinding.Bindable;
import android.databinding.BindingAdapter;
import android.util.Log;
import android.widget.ImageView;

import com.squareup.picasso.Picasso;

/**
 * Created by wuhai on 2017/08/14 15:47.
 * 描述:
 */

public class Student extends BaseObservable{

    private String name;
    private String addr;
    private String photo;

    public Student(String name, String addr) {
        this.name = name;
        this.addr = addr;
    }

    public Student(String name, String addr, String photo) {
        this(name,addr);
        this.photo = photo;
    }

    @Bindable
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyPropertyChanged(BR.name);
    }

    @Bindable
    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
        notifyPropertyChanged(BR.addr);
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    @BindingAdapter("photo")
    public static void getInternetImage(ImageView iv, String url) {
        Picasso.with(iv.getContext()).
                load(url).
                error(R.mipmap.weixin).
                into(iv);
    }
}

b.@BindingAdapter(“photo”)对于图片加载使用注解
实现静态方法getInternetImage,在生成的ActivityMainBinding里你可以查到关联的iv、并且将来加载的url其实就是getPhoto()返回值
※这里注意一定要加网络权限,毕加索并不会主动告诉你缺少权限的,我都被自己蠢到了
c.类继承BaseObservable,并且name、addr的get方法加上@Bindable注解,set方法实现notifyPropertyChanged(BR.name);
这里新加注解的话记得rebuild一下BR后属性才有
3.绑定view

package com.wuhai.mvvm;

import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.squareup.picasso.Picasso;
import com.wuhai.mvvm.databinding.ActivityMainBinding;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn01;
    private EditText name;
    private EditText addr;
    private ActivityMainBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.activity_main);
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main);
        binding.setStu(new Student("路飞","海贼王","https://www.baidu.com/img/bd_logo1.png"));//model和布局绑定

        //取布局id 方式1
//        View view = binding.getRoot();
//        btn01 = (Button) view.findViewById(R.id.btn01);
//        name = (EditText) view.findViewById(R.id.name);
//        addr = (EditText) view.findViewById(R.id.addr);

        //取布局id 方式2
        btn01 = binding.btn01;
        name = binding.name;
        addr = binding.addr;

        btn01.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn01:
                String nameStr = name.getText().toString().trim();
                String addrStr = addr.getText().toString().trim();

                //示例 不做效果展示了,这里只是重新绑定model而已
//                binding.setStu(new Student(nameStr,addrStr));

                //示例2
                Student student = binding.getStu();
                student.setName(nameStr);
                student.setAddr(addrStr);
                break;
        }
    }
}

a.binding.getRoot()取得rootview,然后通过findViewById查找控件,后来发现其实有更简单的方法,就是直接binding.控件id
b.图片展示跟之前name、addr一样,绑定model即可
c.我们点击”更新信息”,改变绑定model同时UI也随着变化
运行效果
这里写图片描述

简单示例3
绑定listview
1.布局
activity_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></ListView>

</RelativeLayout>

item_student.xml

<?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">

    <data>
        <variable
            name="stu"
            type="com.wuhai.mvvm.Student"/>
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="96dp"
        >

        <ImageView
            android:id="@+id/iv"
            android:layout_width="96dp"
            android:layout_height="96dp"
            android:padding="6dp"
            app:photo="@{stu.photo}"/>

        <TextView
            android:id="@+id/description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_toRightOf="@id/iv"
            android:ellipsize="end"
            android:maxLines="3"
            android:text="@{stu.name}"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_toRightOf="@id/iv"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="2dp"
            android:text="@{stu.addr}"
            android:textStyle="bold"/>
    </RelativeLayout>

</layout>

布局只绑定item对应的即可,没啥可讲的
2.model 我们使用上面的Student类
3.绑定实现
ListActivity

package com.wuhai.mvvm;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class ListActivity extends AppCompatActivity {

    private ListView mListView;
    private StudentAdapter mAdapter;

    public static void startActivity(Context context) {
        Intent intent = new Intent(context, ListActivity.class);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        mListView = (ListView) findViewById(R.id.listview);
        mAdapter = new StudentAdapter(this);
        mListView.setAdapter(mAdapter);
        initData();
    }

    private void initData() {
        List<Student> datas = new ArrayList<>();
        for(int x=0;x<20;x++){
            Student student = new Student();
            student.setAddr("地址"+x);
            student.setName("名字"+x);
            student.setPhoto("http://www.lecuntao.com/homenew/templates/default/images/hi.jpg?v=09e9caa5d6");
            datas.add(student);
        }
        mAdapter.setData(datas);
    }
}

StudentAdapter
我们这里着重看下adapter类,其基类不贴出来了,有兴趣的话直接在最后的git下载来看

package com.wuhai.mvvm;

import android.content.Context;
import android.databinding.DataBindingUtil;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.wuhai.mvvm.databinding.ItemStudentBinding;

/**
 * Created by wuhai on 2017/08/15 17:40.
 * 描述:
 */

public class StudentAdapter extends BaseDataAdapter<Student>{

    private LayoutInflater inflater;

    public StudentAdapter(Context context) {
        super(context);
        inflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ItemStudentBinding dataBinding;
        if (convertView == null) {
            dataBinding = DataBindingUtil.inflate(inflater, R.layout.item_student, parent, false);
        } else {
            dataBinding = DataBindingUtil.getBinding(convertView);
        }
        dataBinding.setStu(mData.get(position));

        return  dataBinding.getRoot();
    }

}

代码看上去也极其简单
a.ItemStudentBinding根据布局item_student.xml命名生成的binding类;
b.新增DataBindingUtil类,实现convertView的创建和复用;c.dataBinding.setStu(mData.get(position));实现数据UI绑定
运行效果
这里写图片描述

附上github地址(里面东西比较杂,取mvvm这个module即可)
https://github.com/oceanhai/MyFrame.git

待续…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM + dataBinding 的相关文章

随机推荐

  • 从Trie树(字典树)谈到后缀树(10.28修订)

    从Trie树 xff08 字典树 xff09 谈到后缀树 说明 xff1a 本文基本上是 整理 性质 xff0c 致谢文末的参考文献 引言 常关注本blog的读者朋友想必看过此篇文章 xff1a 从B树 B 43 树 B 树谈到R 树 xf
  • 编程艺术第二十三~四章&十一续:杨氏矩阵查找,倒排索引关键词Hash编码

    第二十三 四章 xff1a 杨氏矩阵查找 xff0c 倒排索引关键词Hash不重复编码实践 作者 xff1a July yansha 编程艺术室出品 出处 xff1a 结构之法算法之道 前言 本文阐述两个问题 xff0c 第二十三章是杨氏矩
  • 如何用Axure的rp8版本做一个好看小程序的原型

    最近公司要做一个小程序 xff0c 抽空研究了一下Axure的各项功能发现挺简单的 xff0c 原型效果如下 xff0c 项目的文件可以点击下载 准备工具 Axure rp8 xff0c 点击下载 微信小程序元件库 xff0c 点击下载 安
  • 教你如何迅速秒杀掉:99%的海量数据处理面试题

    教你如何迅速秒杀掉 xff1a 99 的海量数据处理面试题 本文经过大量细致的优化后 xff0c 收录于我的新书 编程之法 xff1a 面试和算法心得 第六章中 xff0c 新书目前已上架 京东 当当 作者 xff1a July 出处 xf
  • 从决策树学习谈到贝叶斯分类算法、EM、HMM

    从决策树学习谈到贝叶斯分类算法 EM HMM 引言 最近在面试中 xff0c 除了基础 amp 算法 amp 项目之外 xff0c 经常被问到或被要求介绍和描述下自己所知道的几种分类或聚类算法 当然 xff0c 这完全不代表你将来的面试中会
  • 支持向量机通俗导论(理解SVM的三层境界)

    支持向量机通俗导论 xff08 理解SVM的三层境界 xff09 作者 xff1a July 致谢 xff1a pluskid 白石 JerryLead 说明 xff1a 本文最初写于2012年6月 xff0c 而后不断反反复复修改 amp
  • 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

    从K近邻算法 距离度量谈到KD树 SIFT 43 BBF算法 前言 前两日 xff0c 在微博上说 xff1a 到今天为止 xff0c 我至少亏欠了3篇文章待写 xff1a 1 KD树 xff1b 2 神经网络 xff1b 3 编程艺术第2
  • 程序员编程艺术第三十~三十一章:字符串转换成整数,通配符字符串匹配

    第三十 三十一章 xff1a 字符串转换成整数 xff0c 带通配符的字符串匹配 前言 之前本一直想写写神经网络算法和EM算法 xff0c 但写这两个算法实在需要大段大段的时间 xff0c 而平时上班 xff0c 周末则跑去北大教室自习看书
  • Quarkus框架 - 快速入门

    Quarkus框架 快速入门 64 Author xff1a zxw 64 email xff1a 502513206 64 qq com 64 Jishou University 1 前言 最近在观看云原生大会的时候 xff0c 了解到一
  • SQL异常:exist: integer = character varying

    最近在使用mybatis的时候遇到了这样的错误 SQL grammar nested exception is org postgresql util PSQLException ERROR operator does not exist
  • Seata整合nacos

    author zxw email 502513206 64 qq com 64 Jishou University 1 前言 之前一直使用的是seata 43 eureka的方式来使用 xff0c 最近自己在家的时候忽然想用nacos来试试
  • SonarQube整合maven

    64 author xff1a zxw 64 email xff1a 502513206 64 qq com 64 Jishou University sonarLint xff1a https www sonarlint org refe
  • Feign源码分析(二) - builder构建

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Feign源码分析 一 初探Feign 1 前言 通过上篇文章 xff0c 我们得知了Feign类中主要的元数据 xff0c
  • vector容器的三种遍历方法

    STL Standard Template Library 中vector容器是最常见的容器之一 xff0c 设计中经常需要遍历vector容器 xff0c 本文介绍三种常用的vector遍历方式 一 下标索引遍历 span class t
  • Sentinel源码分析(三) - 调用链路

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Sentinel源码分析 一 初识SentinelSentinel源码分析 二 Entry构建 1 前言 之前已经分析过En
  • Sentinel源码分析(四) - 限流规则

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Sentinel源码分析 一 初识SentinelSentinel源码分析 二 Entry构建Sentinel源码分析 三
  • Sentinel源码分析(五) - 熔断降级

    64 Author xff1a zxw 64 Email xff1a 502513206 64 qq com 目录 Sentinel源码分析 一 初识SentinelSentinel源码分析 二 Entry构建Sentinel源码分析 三
  • 无人机姿态解算:四元数及其与欧拉角的转换

    无人机姿态解算 xff1a 四元数及其与欧拉角的转换 引言 xff1a 获得无人机飞行时的飞行姿态对于无人机稳定控制来说至关重要 无人机主要通过传感器数据融合来进行状态估计 xff0c 常用于无人机的传感器包括 xff1a MPU xff0
  • 无涯教程:Docker - Node.js安装

    无涯教程网 Node js是一个JavaScript框架 xff0c 用于开发服务器端应用程序 xff0c 它是一个开放源代码框架 xff0c 可以在各种操作系统上运行 现在 xff0c 我们将看到启动和运行用于Node js的Docker
  • MVVM + dataBinding

    MVVM 43 dataBinding mvvm模式不做过多讲解 xff0c 参考下面文章或其他文章对mvvm描述 http www jianshu com p 6872b699879d 后面又发现一篇比较好的文章 xff0c 补上 htt