Android MVVM Demo

AndroidMvvm练习

AndroidMVVM 是Google推出的,网上介绍也有很多,我就不废话了,公司项目中使用的mvvm,我整理个小demo练习记录一下

1.DataBinding

配置

 dataBinding {
        enabled = true
    }

在XML中使用, 原先的布局还是照常写

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

    <data>

        <variable
            name="viewModel"
            type="com.pltest.mvvmtest.MainActViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <!--    // 点击事件可以在act中设置  也可以在XML 直接写-->
        <Button
            android:id="@+id/btGet"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="getData"
            android:textAllCaps="false"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

2.ViewModel

新建ViewModel,继承至ViewModel

class MainActViewModel : ViewModel()

在Activity中获取实例

 private val mViewModel by lazy {
        ViewModelProviders.of(this).get(MainActViewModel::class.java)
    }

XML中声明的VIewModel

 <data>
        <variable
            name="viewModel"
            type="com.pltest.mvvmtest.MainActViewModel" />
    </data>

XML中的VIewModel 和ViewModel实例绑定

mBinding.viewModel = mViewModel

在ViewModel 中声明LiveData

 private val _countLive = ObservableField<String>()
    val countLive get() = _countLive
    private fun refreshCount() {
        _countLive.set("当前条数 : " + _dataLive.value?.size)
    }

    private val _dataLive = MutableLiveData<MutableList<Bean>>()
    val dataLive get() = _dataLive
    private fun setData(list: MutableList<Bean>) {
        _dataLive.value = list
        refreshCount()
    }

在xml中可以直接设置监听ViewModel的数据变化 以及点击事件

<Button
            android:id="@+id/btAdd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{()->viewModel.addData()}"
            android:text="addData"
            android:textAllCaps="false"
            app:layout_constraintLeft_toRightOf="@id/btGet"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/tvCount"
            android:layout_width="wrap_content"
            android:layout_height="0dp"
            android:gravity="center"
            android:text="@{viewModel.countLive}"
            android:textSize="18sp"
            app:layout_constraintBottom_toBottomOf="@id/btAdd"
            app:layout_constraintLeft_toRightOf="@id/btAdd"
            app:layout_constraintTop_toTopOf="parent" />

在Activity中设置LiveData回调监

  mViewModel.apply {
            dataLive.observe(this@MainActivity, Observer {
                mAdapter.setData(it)
            })

            onItemChangeLive.observe(this@MainActivity, Observer {
                mAdapter.notifyItemChanged(it)
            })
        }

在列表中的点击事件,调用ViewModel中的方法。进行逻辑处理。操作数据

    fun onItemClick(position: Int) {
        if (position > _dataLive.value?.size ?: 0) return
        val data = _dataLive.value ?: return
        data[position].isSelect = !data[position].isSelect
        _onItemChangeLive.value = position
    }

最后附demo地址:https://github.com/13522280478/AndroidMVVMTest.git

热门文章

暂无图片
编程学习 ·

安卓安全那点事

本文旨在对于一个安卓app的安全知识做一个较为泛泛的总结,为开发出更安全的应用提供思路。内容比较粗略,仅起到抛砖引玉的效果,还望大家见谅。Android应用的安全 意义 在维基百科上有一个关于计算机安全的定义: 计算机安全(computer security)是计算机与网络领域的信息安…
暂无图片
编程学习 ·

省市区三级行政区数据获取和GeoJson地图下载

文章目录1.背景2.行政区域数据获取3.获取GeoJson数据 1.背景 项目中用到省市区三级的行政区划的选择,在网上找到的数据与最新的行政区域划分不一致,也难以确认数据的完成性。 基于echarts完成数据地区分布图时,需要提供地区对应的geoJson格式地图。 2.行政区域数据获取 高德…
暂无图片
编程学习 ·

人脸活体离线识别摇头点头张嘴眨眼动作活体算法源码解析

活体识别要求最近我们公司的项目需要做一个活体识别的功能,要求如下: 1.离线识别,本地识别活体,这样速度快1s内完成。需要识别出人脸,并判断是否在摇头 ,点头,张嘴,眨眼等动作,进而判断是否活体,准确率要求90%即可,可以去破解相信没有任何一个项目能完全规避的,哪怕…
暂无图片
编程学习 ·

难得一遇的5G大屏手机 荣耀X10 Max配置分析

6月22日,荣耀通过微博证实了荣耀X10 Max的存在,并宣布将会在7月2日正式发布。消息一出可谓是让很多人非常欣喜,尤其是等了多年大屏手机的用户。荣耀X10 Max不仅是荣耀在5G时代发布的首款大屏手机,也是荣耀时隔两年,继荣耀8X后的续作。那么这款5G大屏手机有哪些特点和配置呢…
暂无图片
编程学习 ·

约瑟夫生死小游戏

约瑟夫生者死者小游戏 30 个人在一条船上,超载,需要 15 人下船。 于是人们排成一队,排队的位置即为他们的编号。 报数,从 1 开始,数到 9 的人下船。 如此循环,直到船上仅剩 15 人为止,问都有哪些编号的人下船了呢? # 首先来一个超载的小船30人 people = list(range(1,3…
暂无图片
编程学习 ·

MySql简单入门_第四篇(2)_存储

5、存储过程:为以后的使用而保存的一条或多条MySql语句的集合存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(…
暂无图片
编程学习 ·

Linux挂载iso镜像文件作为本地yum源

1 挂载ISO文件到/mnt/cdrom下:[root@localhost]# mount -o loop /home/CentOS-7-x86_64-DVD-1708.iso /mnt/cdrom2 创建repo文件:[root@localhost /]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# mkdir bak [root@localhost yum.repos.d]# mv *.repo /etc/yum.re…
暂无图片
编程学习 ·

文件-复制-删除-移动

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.PrintWriter; public class CopyFile { public CopyFile() { } /** * 新建目录 * @param folderPat…
暂无图片
编程学习 ·

记录一次已解决的异常故障

记录一次已解决的异常故障描述:centos7.5服务器,使用crontab定时调用kettle执行数据库任务。问题:定时任务完成后,数据库记录出现两条一模一样的记录,时间也一样,导致数据异常故障排除:查找crontab调用日志,查看kettle日志,均只调用一次,数据库存储过程存在两次执行记…
暂无图片
编程学习 ·

Spring测试中的事务

目录 文章目录@Transactional @Transactional 1、测试方法加上该注解后事务自动回滚。 2、@BeforeEach与@AfterEach在测试方法的事务中执行 3、@BeforeTransactional与@AfterTransactional在事务执行之前之后执行;并且没有加@Transactional的测试方法不执行这两个注解下的方法…
暂无图片
编程学习 ·

C语言复习笔记

C语言复习笔记 仅记录复习过程中的混淆和记忆模糊的知识点。 1、常量-八进制整数 在C语言中,如果一个整数是以 0 开头的,那么这个数是以八进制来表示的,即八进制整数。0x为十六进制整数。 2、 一个整数,例如1500,为 int 类型(21亿),如果是 1500L,则表示长整型,1500U …
暂无图片
编程学习 ·

算子

算子:是一个函数空间到函数空间上的映射O:X→X。广义上的算子可以推广到任何空间,如内积空间等。 应用领域:数理科学 别 称:算符 外文名 :operator 应用领域:数理科学算子解释广义的算子, 对任何函数进行某一项操作都可以认为是一个算子,甚至包括求幂次,开方…
暂无图片
编程学习 ·

leetcode-面试题 17.11. 单词距离

问题: 有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗? 示例: 输入:words = ["I","am","a","student…
暂无图片
编程学习 ·

python3安装OpenCV3出现:ImportError: numpy.core.multiarray failed to import

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是…
暂无图片
编程学习 ·

linux-centos7 最小化系统 -源码编译安装apache服务详细步骤

文章目录前言一:安装apache步骤详解1.1:安装准备环境 :centos7.6 最小化安装版1.2 首先安装编译相关软件1.3: 然后准备解压相关源码包1.4 源码编译安装 expat 软件1.5 源码编译安装apache软件二.配置相关参数2.1 . 将apache软件交给service管理2.2 编辑http主页内容2.3 本…
暂无图片
编程学习 ·

Arcgis api for Javascript + arcgisServer + arcSDE笔记(1)

最近要搞的项目要用Arcgis api for Javascript做地图模块,自己开始学相关的技术。这是之前整理的笔记,现在传到博客上,也作为学习的记录0 环境搭建Arcgis软件统一使用10.2版本(更新的版本很难找到比较齐全的server、sde等配套软件),安装arcgis Desktop、arcgis Server、a…
暂无图片
编程学习 ·

三层交换配置路由

三层交换配置路由3.1 问题 如何使用三层交换机和路由配置实现全网互通? 配置思路: 1.终端设备pc 2.交换机 -sw1.2.4 接口设置 3.三层交换 -sw3建立vlan -与交换机连接设置trunk允许所有 -vlanif 设置ip地址 -创建vlan 300 接口0/0/3设置acce模式 加入vlan 300 进入vlanif 300…
暂无图片
编程学习 ·

Media soup源码分析(二)channel的建立

正文目录JS部分先看整体展开Worker重要函数channel的建立JS部分的总结C++部分main流程图main.cppSocket的建立UnixStreamSocket.cppconsumerSocketUnixStreamSocketonReadOnUvReadUserOnUnixStreamReadOnConsumerSocketMessageRequestOnConsumerSocketMessageOnChannelRequest …
暂无图片
编程学习 ·

局部变量和成员变量的区别

局部变量和成员变量的区别 萌新的日常操作 1、定义的位置不一样【重点】局部变量:在方法内部 成员变量:类里方法外2、作用范围不一样【重点】局部变量:只有方法当中才可以使用,出了方法就不能再用了 成员变量:作用范围是整个类都可以通用3、默认值不一样【重点】局部变量:…