Google官方关于Android架构中MVP模式的示例续-DataBinding

基于前面的TODO示例,使用Data Binding库来显示数据并绑定UI元素的响应动作。

这个示例并未严格遵循 Model-View-ViewModel 或 Model-View-Presenter 模式,其中既有View Model,也有Presenter。

用到的Data Binding库保存样板代码,该代码允许将UI元素绑定到Data Model的一个属性。

  • 布局文件中直接绑定数据到UI元素上
  • 事件也与动作Handler进行绑定
  • 数据可以被监听并根据需要自动同步更新

数据绑定

在上个例子中,Task描述在TaskDetailFragment中被设置:

public void onCreateView(...) {
    ...
    mDetailDescription = (TextView)
root.findViewById(R.id.task_detail_description);
}

@Override
public void showDescription(String description) {
    mDetailDescription.setVisibility(View.VISIBLE);
    mDetailDescription.setText(description);
}

本示例中,TaskDetailFragment会很潇洒的将Task数据传递给Data Binding层:

@Override
public void showTask(Task task) {
    mViewDataBinding.setTask(task);
}

该库还会考虑到数据的显示问题,只要在布局中定义一下即可: (taskdetail_frag.xml)

<TextView
    android:id="@+id/task_detail_description"
    ...
    android:text="@{task.description}" />

事件绑定

数据绑定消除了findViewById(),而事件绑定则用于最小化 setOnClickListener().

taskdetail_frag.xml文件中的CheckBox,当用户触摸它时,Presenter直接被调用:

<CheckBox
    android:id="@+id/task_detail_complete"
    ...
    android:checked="@{task.completed}"
    android:onCheckedChanged="@{(cb, isChecked) ->
    presenter.completeChanged(task, isChecked)}" />

监听数据(Observing data)

显示任务列表的视图层(TasksFragment)只需知道列表数据为空,以便显示恰当的提示消息。它用到TasksViewModel来给布局提供该信息。当列表大小被赋值时,只有相关属性会被通知且绑定到这些属性的UI元素会被更新。

public void setTaskListSize(int taskListSize) {
    mTaskListSize = taskListSize;
    notifyPropertyChanged(BR.noTaskIconRes);
    notifyPropertyChanged(BR.noTasksLabel);
    notifyPropertyChanged(BR.currentFilteringLabel);
    notifyPropertyChanged(BR.notEmpty);
    notifyPropertyChanged(BR.tasksAddViewVisible);
}

功能组件

用DataBinding库可以有多种方式来创建相关。本示例中,每个组件的职责为:

  • Activity: 对象创建入口
  • Fragment: 与Android框架中的组件交互 (options menu, Snackbar, FAB, Adapter for list…)
  • Presenter: 接收用户动作并从数据仓库中检索数据。如果它进行数据加载的工作,则去调用一个动作处理类来完成 (TasksItemActionHandler)
  • ViewModel: 暴露数据给指定视图

有些功能没有用到 ViewModel (TaskDetail, AddEditTask) ,这时他们是直接使用Task模型的

依赖

Data Binding 库.

特征(译:废话就不再翻译了)

可测试性

单元测试

UI测试

代码量

可维护性

增添特性容易

学习成本

https://github.com/googlesamples/android-architecture/tree/todo-databinding/

posted @ 2016-11-28 12:28  x3d  阅读(1129)  评论(0编辑  收藏  举报