转载请声明:http://blog.youkuaiyun.com/yoyo_newbie/article/details/51957578
需求二: 实现用户简介界面---已知用户名字为Sam, 年龄为25.进入界面时候,要求显示用户名字字段,年龄字段,内容都显示未加载,点击 “显示数据”才显示用户的数据
UI效果图:
使用databinding , 响应事件不在需要在activity里面添加, 而是在View Model里面添加!是不是很6?
关键代码
<Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="显示数据" android:onClick="@{userModel.freshUserInfoOnClick}" />
public class UserModel { ......................... /** * 点击刷新用户数据事件 */ public void freshUserInfoOnClick(View view) { ....... } }
在,实现需求之前。有个疑问,当我ViewModel的数据已经设置绑定初始化后,
我想第二次数据刷新,怎么通知刷新?
这种实现方式有2种,下面介绍推荐的一种,另外一种非常麻烦,不多说。
第一步,修改属性的类型
如:这里的name 的类型是String 改为
public ObservableField<String> name= new ObservableField<String>();
定义属性类型规则如下,
基本类型修改:
xxx 改为ObservableXXX
如
int ->ObservableInt
boolean ->ObservableBoolean
对象类型修改
xxx 改为
ObservableField<XXXXXX>
第二步,调用Observable的set()方法进行通知刷新
(注意:如果值相同不会执行view的绘制,如果依旧要通知刷新,调用notifyChange(),有人就问了,相同值还刷新有什么意义?学到后面就知道为什么需要了,本编暂时不解析)
关键代码:
public ObservableField<String> name= new ObservableField<String>(); public ObservableField<String> age=new ObservableField<String>();........................
/**
* 是刷新用户数据
*/
public void freshUserInfo()
{
name.set("Sam") ;
age.set("25");
}
以下全部实现代码:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="userModel"
type="com.yoyonewbie.mvvm.vm.UserModel"
/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="姓名:"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userModel.name}"
/>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="@dimen/activity_vertical_margin"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="年龄:"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{userModel.age}"
/>
</LinearLayout>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示数据"
android:onClick="@{userModel.freshUserInfoOnClick}"
/>
</LinearLayout>
</layout>
package com.yoyonewbie.mvvm.vm;
import android.databinding.Observable;
import android.databinding.ObservableBoolean;
import android.databinding.ObservableField;
import android.databinding.ObservableInt;
import android.view.View;
public class UserModel {
public ObservableField<String> name= new ObservableField<String>();
public ObservableField<String> age=new ObservableField<String>();
public void init()
{
name.set("未加载") ;
age.set("未加载");
}
/**
* 是刷新用户数据
*/
public void freshUserInfo()
{
name.set("Sam") ;
age.set("25");
}
/**
* 点击刷新用户数据事件
*/
public void freshUserInfoOnClick(View view)
{
freshUserInfo();
}
}
package com.yoyonewbie.mvvm.view.activity;
import android.databinding.DataBindingUtil;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.yoyonewbie.mvvm.vm.UserModel;
import com.yoyonewbie.test.R;
import com.yoyonewbie.test.databinding.MainActivityBinding;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivityBinding mainActivityBinding = DataBindingUtil.setContentView(this, R.layout.main_activity);
UserModel user = new UserModel();
user.init();
mainActivityBinding.setUserModel(user);
}
}
实现效果:
进入界面预览:
点击后: