Android Studio 之 LiveData 的配合使用,底层数据变化,自动通知界面

viewModelWithLikeData.getLikeNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});

通过 ViewModel 对象方法的 observe  onChanged事件,自动对界面上的控件,进行数据更新

1.ViewModel类

创建 对象 MutableLiveData<Integer> likeNumber

创建 这个对象的 GET  、 SET 方法

package com.example.livedatatest;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel; public class ViewModelWithLikeData extends ViewModel {
private MutableLiveData<Integer> likeNumber; //用构造函数,防止访问到的内容是空的,不能这样用,不知道为什么,会出错
/*
ViewModelWithLikeData(){
likeNumber = new MutableLiveData<>();
likeNumber.setValue(0);
}
*/ public MutableLiveData<Integer> getLikeNumber() {
if(likeNumber==null) {
likeNumber = new MutableLiveData<>();
likeNumber.setValue(0);
}
return likeNumber;
} public void setLikeNumber(MutableLiveData<Integer> likeNumber) {
this.likeNumber = likeNumber;
} public void addLikeNumber(int n) {
likeNumber.setValue(likeNumber.getValue()+n);
}
}

  

2. Activity 类

创建 ViewModel 对象,实例化对象

对 ViewModel 对象的 observe onChanged 事件进行监控,如有变化,就自动给控件赋值!


package com.example.livedatatest;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProviders; public class MainActivity extends AppCompatActivity { ViewModelWithLikeData viewModelWithLikeData;
TextView textView;
ImageButton imageButton1;
ImageButton imageButton2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); textView = findViewById(R.id.textView);
imageButton1 = findViewById(R.id.imageButton);
imageButton2 = findViewById(R.id.imageButton2 ); //注意: ViewModelProviders 必须在 build.gradle 中引入如下语句,否则导入不了类
//implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
viewModelWithLikeData = ViewModelProviders.of(this).get(ViewModelWithLikeData.class); //设置一个监听器,当这个值有变化时,自动给控件赋值。 viewModelWithLikeData.getLikeNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
}); imageButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModelWithLikeData.addLikeNumber(1); //点赞加1
}
}); imageButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
viewModelWithLikeData.addLikeNumber(-1); //踩-1
}
}); }
}

  

Android Studio 之 LiveData 的配合使用,底层数据变化,自动通知界面的更多相关文章

  1. Android Studio中获取sha1证书指纹数据的方法

    高德地图开发申请KEY的时候需要开发者提供SHA1证书指纹数据,在eclipse很容易就找到了,但是Android Studio很久也没找到,只能使用在网上看到的方法了,在Android Studio ...

  2. Android studio和Genymotion-VirtualBox的配合使用

    Android Studio自带的模拟器实在是太慢了,对于我这种急性子来说简直...好了,我不想说脏话 那么我们就愉快的使用Genymotion好了 Android 开发最好的网站:http://ww ...

  3. Android studio教程:[2]项目整体布局

    上篇介绍了如何创建项目,这一次将介绍创建完的项目如何呈现在开发者的眼前,介绍android studio开发环境的整体布局,让大家知道各个模块的位置和功能. 工具/原料 Android studio ...

  4. Android Studio奇淫巧技

    目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Act ...

  5. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap ...

  6. android studio 使用gradle 导出jar包,并打包assets目录

    警告:本文年久失修. 随着android studio的升级 ,gradle的升级,严格按照本文的代码去做可能不会成功,希望依然可以作为解决问题的思路. 最近项目在做一个sdk,供别的开发者使用,所以 ...

  7. Android Studio导入项目非常慢的解决办法

    问题 Android Studio目前已经更新到2.0 Preview 6了,作为Google大力推崇的开发工具,相对于Eclipse ADT有着不可比拟的优势.然而在实际使用时,依然有不少不爽的地方 ...

  8. Android课程---Android Studio的一些小技巧

    APK瘦身 在Android Studio中我们可以开启混淆,和自动删除没有Resources文件,来达到给APP瘦身的目的,这对于一些维护很久的老项目比较有用,里面有很多无效的Resource, 删 ...

  9. Android课程---Android Studio安装及使用

    2013年Google I/O 大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA 开发环境,旨在取代Eclipse和ADT(And ...

随机推荐

  1. 为什么要用 redis 而不用 map 做缓存?

    缓存分为本地缓存和分布式缓存.以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例 ...

  2. python爬虫---js加密和混淆,scrapy框架的使用.

    python爬虫---js加密和混淆,scrapy框架的使用. 一丶js加密和js混淆 js加密 ​ 对js源码进行加密,从而保护js代码不被黑客窃取.(一般加密和解密的方法都在前端) http:// ...

  3. Vue学习之路由vue-router小结(九)

    一.路由: 1.后端路由: 对于普通网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源: 2.前端路由: 对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页 ...

  4. 21、解决关于 vue项目中 点击按钮路由多了个问号

    在vue项目开发过程中,点击按钮结果页面刷新了一遍 后来发现路径变成了 localhost:8080/?#/login 原因: 这里是 form 表单,点击了button 按钮,触发了他的默认事件,就 ...

  5. PHP extension_loaded()用法

    一.extension_loaded()函数表示检查一个扩展是否成功加载 if(!extension_loaded('sysvmsg')) { echo "Please install sy ...

  6. 从 Vue 的视角学 React(一)—— 项目搭建

    虽然 Vue 在国内一家独大,但在全球范围内,React 依然是最流行的前端框架 最近和一些朋友聊天,发现很多项目都选择了 React 技术栈,而且公司的新项目也决定使用 React 我一直以来都是走 ...

  7. C#8.0——异步流(AsyncStream)

    异步流(AsyncStream) 原文地址:https://github.com/dotnet/roslyn/blob/master/docs/features/async-streams.md 注意 ...

  8. 带你快速上手前端三剑客之css

    CSS介绍 ​ CSS(Cascading Style Sheet , 层叠样式表)定义如何显示HTML元素.当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染) 组成 ​ 每个CS ...

  9. 【转】tf.SessionRunHook使用方法

    原文地址:https://blog.csdn.net/mrr1ght/article/details/81011280 .本文有删减. tf.train.SessionRunHook()是一个类:用来 ...

  10. php备忘录模式(memento pattern)

    晚上刷起来. <?php /* The memento pattern provides the object restore functionality. Implementation is ...