Android之MVC——Model通知View去更新(实用)
下面两段标红加深的代码是重点:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import java.util.Observable;
import java.util.Observer;
// you must implements Observer
public class ObserverExample extends Activity implements Observer { // Button variables for our 4 UI buttons which perform touchdowns and field
// goals for the Home and Away teams.
Button button1;
Button button2;
Button button3;
Button button4; // Score variable for the Score object we'll be using to track and report
// out both teams' scores.
Score score; // TextView variables for our scoreboard display, #2 is Home score, #4 is
// Vistors score.
TextView textView2;
TextView textView4; // Set some constants to make the code more human-readable.
private static final int HOME = 1;
private static final int VISITOR = 2; @Override
public void update(Observable observable, Object data) { // Set the score to the current score each time there's a change.
// Creating a helper method is a nice way to simplify the code here.
setScore();
} // Grabs the score for the Home team and Away team and displays them in
// the correct TextView's of the scoreboard. private void setScore() { textView2.setText(String.valueOf(score.getScore(HOME)));
textView4.setText(String.valueOf(score.getScore(VISITOR)));
} @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // Create a new score object, this will contain all of the logic to
// track and report out both team's scores.
score = new Score(); // Score is an Observable class, therefore, we can use the method
// addObserver to add this Activity as an Observer using it's local
// context. This is the magic sauce that enables instant updates
// whenever the Score changes. When the Score reports a change, the
// update() method runs in this Activity.
score.addObserver(this); // This code ties in our TextView variables to the actual ID's of the UI
// elements themselves.
textView2 = (TextView) findViewById(R.id.textView2);
textView4 = (TextView) findViewById(R.id.textView4); // Ties in the ID of the button to our variable set above.
button1 = (Button) findViewById(R.id.button1); // Creates a new instance of OnClickListener which fires the onClick()
// method upon, well, a click.
button1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { // Update the score by running the touchDown() method for the
// Home team.
score.touchDown(HOME); }
}); // Same idea as above repeated for buttons 2 - 4.
button2 = (Button) findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { // Update the score by running the fieldGoal() method for the
// Home team.
score.fieldGoal(HOME); }
}); button3 = (Button) findViewById(R.id.button3); button3.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { score.touchDown(VISITOR);
}
}); button4 = (Button) findViewById(R.id.button4); button4.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { score.fieldGoal(VISITOR);
}
}); } }
import java.util.Observable; // In order to report changes to any interested objects, such as Activities, we
// need to extend the Observable class. This enables other objects to register
// themselves as an Observer by using the addObserver() method.
public class Score extends Observable { // Initialize the score, scores always start at zero.
private int home_score = 0;
private int visitor_score = 0; public Score() { } // Grant 1 point to the team based on the variable fed in HOME == 1
// and VISITOR == 2;
public void fieldGoal(int team)
{ switch (team) {
case 1:
this.home_score = this.home_score + 1;
break; case 2:
this.visitor_score = this.visitor_score + 1;
break;
} triggerObservers(); } // Returns the score of the Home or Visitor teams depending on which
// variable is fed.
public int getScore(int team) { switch (team) {
case 1:
return home_score;
case 2:
return visitor_score;
} return 0;
} // Adds six points to score of the team fed in as a variable, HOME == 1 and
// VISITOR == 2
public void touchDown(int team) { switch (team) {
case 1:
this.home_score = this.home_score + 6;
break; case 2:
this.visitor_score = this.visitor_score + 6;
break;
} triggerObservers();
} // Create a method to update the Observerable's flag to true for changes and
// notify the observers to check for a change. These are also a part of the
// secret sauce that makes Observers and Observables communicate
// predictably.
private void triggerObservers() { setChanged();
notifyObservers();
} }
Android之MVC——Model通知View去更新(实用)的更多相关文章
- MVC(Model(模型) View(视图) Controller(控制器))
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
- MVC - Model - Controller - View
一. Model 1.1 在ASP.NET MVC 中 model 负责的是所有与 "数据“ 相关的的任务. 也可以把Model 看成是 ASP.NET 中三层模式的 BLL层 加 DA ...
- [Backbone]4. Model & View, toggle between Model and View. -- 1
如上图所示: Server有Data都交给Models处理, 然后由Models给Views Data,让View去告诉DOM如何显示, 然后DOM显示HTML; View events update ...
- ASP.NET MVC轻教程 Step By Step 4——Model、View和Controller
ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Mess ...
- 使用WebFrom来模拟一些MVC的MODEL与View的数据交互功能
MVC中有一点非常闪瞎人眼的功能就是,可以根据Model与View视图来直接将页面也数据模型进行绑定,那么我们在想客户端发送页面时不需要进行各种控件赋值,不需要操心怎么渲染,当客户提交表单给服务器时也 ...
- Spring MVC:Model、View、ModelAndView
个人理解:View为服务器上的某个文件容器,可以为JSP,FTL等动态页面文件,甚至是媒体文件等等,单单是一个文件.Model的作用是存储动态页面属性,动态页面文件即View可以在Model中获取动态 ...
- What is the difference between Reactjs and Rxjs?--React is the V (View) in MVC (Model/View/Controller).
This is really different, React is view library; and Rxjs is reactive programming library for javasc ...
- 2017年第1贴:EXT.JS使用MVC模式时,注意如何协调MODEL, STORE,VIEW,CONTROLLER的关系
也调了快一天,死活找不到窍门. MODEL, STORE,VIEW的调置测试了很久,试了N种方法,不得其果. 最后,试着在APPLICATION里加入CONTROLLER, 在CONTROLLER里加 ...
- ASP.NET MVC之model传值view
控制器中,我们有时会在知道用户名的情况下,再获取相关数据 例如: public ActionResult Index() { UserInfo Entity_Tem ...
随机推荐
- CCF CSP 201609-4 交通规划
CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201609-4 交通规划 问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自 ...
- Hive(三)Hive元数据信息对应MySQL数据库表
概述 Hive 的元数据信息通常存储在关系型数据库中,常用MySQL数据库作为元数据库管理.上一篇hive的安装也是将元数据信息存放在MySQL数据库中. Hive的元数据信息在MySQL数据中有57 ...
- 【POJ】2454.Jersey Politics
题解 有种迷一样的讽刺效果 每个城市有1000头牛,然后你现在知道对于自己政党每个城市的选票,把城市划分成三个州,保证在至少两个州内获胜 找出前2K大的然后random_shuffle,直到前K个加起 ...
- thinkphp getField()获取一列或一个数据
在开发中经常要获取一个数据的情况,thinkphp中有一个getField()方法可以解决这个问题. 获取一个数据 1 2 $user = M('demo'); $data = $user->g ...
- thinkphp3.2开启静态缓存与缓存规则设置
网站的静态缓存对大访问量有很好的缓解作用,尤其对网站的大并发,可有效的缓解数据库的压力.在thinkphp中实现静态缓存很简单,thinkphp都已经封装好了直接调用即可. 静态缓存 首先设置 H ...
- Python之路【第十篇】: python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 recv与 ...
- 一个将PDF转word、图片、PPT的在线工具
smallpdf 真的超级棒! https://smallpdf.com/cn
- Logback配置解析
logback优点 比较吸引的几个优点如下: 内核重写,初始化内存加载更小 文档比较齐全 支持自动重新加载配置文件,扫描过程快且安全,它并不需要另外创建一个扫描线程 支持自动去除旧的日志文件,可以控制 ...
- iOS 11开发教程(七)编写第一个iOS11代码Hello,World
iOS 11开发教程(七)编写第一个iOS11代码Hello,World 代码就是用来实现某一特定的功能,而用计算机语言编写的命令序列的集合.现在就来通过代码在文本框中实现显示“Hello,World ...
- Linux嵌入式文件系统(网络文件系统)
<文件系统定义> 怎么将文件和文件目录加载到linux内核中,这一种加载的方式就叫做文件系统 <建立根文件系统目录和文件> <创建目录> 1)在linux系统中使用 ...