当前位置: 首页 > news >正文

南京高端网站建设公司莆田seo推广公司

南京高端网站建设公司,莆田seo推广公司,温州做网店的网站,在柬埔寨做网站彩票推广MVVM MVVM是什么?MVVM实现前提ModelViewModelView MVVM是什么? Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理 Mode:封装数据存储及相关操作逻辑,与MV…

MVVM

  • MVVM是什么?
  • MVVM实现
    • 前提
    • Model
    • ViewModel
    • View

MVVM是什么?

Model-View-ViewMode架构,可看作MVP改进版,将此前Presenter的逻辑操作交给ViewMode中的Binder去处理

在这里插入图片描述

  • Mode:封装数据存储及相关操作逻辑,与MVC/MVP不同的是会提供一系列实体类与UI绑定,ViewModel修改这些数据后将数据变化告诉View
  • View:处理界面逻辑但不参与业务逻辑,显示ViewModel提供的数据
  • ViewModel:视图模型与视图状态的合称,为View提供一个可供显示的数据模型并收集、处理这些数据,内部的Binder用于双向绑定,还可包含多个Child ViewModel

MVVM实现

前提

在build.gradle中android节点添加如下代码(最低SDK版本为API7,Gradle版本为1.5.0-alpha1)

dataBinding{enabled = true
}

Model

创建数据实体类LoginInfo

  • 继承BaseObservable
  • getXXX()方法通过@Bindable注解表示该方法所返回的数据被修改时会更新UI
  • setXXX()方法调用notifyPropertyChanged()告诉DataBinding该字段被更改
public class LoginInfo extends BaseObservable {private String mUser;private String mPassword;public LoginInfo(String user, String password) {mUser = user;mPassword = password;}@Bindablepublic String getUser() {return mUser;}public void setUser(String user) {mUser = user;notifyPropertyChanged(BR.user);}@Bindablepublic String getPassword() {return mPassword;}public void setPassword(String password) {mPassword = password;notifyPropertyChanged(BR.password);}
}

ViewModel

LoginModel封装维护LoginInfo、点击事件、文本改变事件

public class LoginModel {private static final String DEF_USER = "song";private static final String DEF_PASSWORD = "123";public LoginInfo mInfo;private OnLoginListener mListener;public LoginModel(OnLoginListener listener) {mListener = listener;mInfo = new LoginInfo("", "");}public TextWatcher getUserTextWatcher() {return new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {mInfo.setUser(s.toString());}};}public TextWatcher getPasswordTextWatcher() {return new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}@Overridepublic void afterTextChanged(Editable s) {mInfo.setPassword(s.toString());}};}public interface OnLoginListener {void onLoginSuccess();void onLoginFail();}public void onLoginClick(View view) {if (mInfo.getUser().equals(DEF_USER) && mInfo.getPassword().equals(DEF_PASSWORD)) {mListener.onLoginSuccess();} else {mListener.onLoginFail();}}
}

View

xml文件根节点变为layout,布局分为

  • 数据部分:声明所使用到的数据实体类以及构造该对象时的引用名
  • UI部分:常规控件,可直接使用数据实体类对象中的字段、方法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"><data><variablename="model"type="com.demo.demo0.LoginModel" /></data><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_horizontal"android:orientation="vertical"><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:addTextChangedListener="@{model.getUserTextWatcher}"android:hint="User"android:text="@{model.mInfo.getUser}" /><EditTextandroid:layout_width="match_parent"android:layout_height="wrap_content"android:addTextChangedListener="@{model.getPasswordTextWatcher}"android:hint="Password"android:text="@{model.mInfo.getPassword}" /><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="@{model.onLoginClick}"android:text="Login" /></LinearLayout></layout>

MainActivity开启线程3秒后修改数据会显示在UI

  • 通过DataBindingUtil.setContentView设置布局,布局名字为R.layout.ab_cd,则对应类为AbCdBinding,为其设置Model
public class MainActivity extends AppCompatActivity implements LoginModel.OnLoginListener {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);LoginModel model = new LoginModel(this);binding.setModel(model);new Thread(new Runnable() {@Overridepublic void run() {SystemClock.sleep(3000);model.mInfo.setUser("New User");model.mInfo.setPassword("New Password");}}).start();}@Overridepublic void onLoginSuccess() {Log.d(TAG, "onLoginSuccess: ");}@Overridepublic void onLoginFail() {Log.d(TAG, "onLoginFail: ");}
}
http://www.hrbkazy.com/news/52395.html

相关文章:

  • 买域名做网站表白图片优化
  • 庞各庄网站建设seo方法图片
  • 企业邮箱app下载百度搜索优化软件
  • 宝应宝楠国际学校保定网站seo
  • 怎样备份网站免费推广
  • 隐藏网站源代码百度官方版下载
  • 新手做网站流程查询seo
  • 深圳网站建设 百业在线制作网站免费
  • java web网站开发郑州新闻发布
  • 清远企业网站建设公司刷外链
  • 如何利用源码做网站公司seo
  • 正规的网站建设工作室湖北疫情最新情况
  • 南昌餐厅网站建设外贸seo优化
  • 信誉好的专业网站建设四川seo多少钱
  • 北京最新头条新闻seo入门教程
  • 增加网站和接入备案吗上海网站排名seo公司
  • 公司网站 模板seo网络推广培训班
  • app设计网站有哪些功能给公司做网站要多少钱
  • wordpress 自定义rss合肥百度关键词优化
  • 上海网站建设企业网站流量统计工具
  • 给网站整一个客服 怎么做百度应用中心
  • 北京网站开发网站建设价格seo技术培训茂名
  • 政府网站集约化建设范围网络推广竞价
  • 做视频网站需要多大带宽安卓系统优化app
  • 网站建设合作伙伴seo模拟点击工具
  • 如何做试玩类网站酒店推广渠道有哪些
  • 帮他人做视频网站违法吗app制作
  • 武汉设计工程学院专升本seo模拟点击有用吗
  • 网站建设费税收分类如何在网站上推广自己的产品
  • asp网站服务器架设关键词优化seo费用