• 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/

  • 相关阅读:
    删除了原有的offset之后再次启动会报错park Streaming from Kafka has error numRecords must not ...
    sparkStreaming消费kafka-1.0.1方式:direct方式(存储offset到Hbase)
    sparkStreaming消费kafka-1.0.1方式:direct方式(存储offset到zookeeper)
    进程的管理(五)-进程的实现
    进程管理(四)-进程的状态以及转换
    进程管理(三)-进程的层次
    numpy库的认识以及数组的创建
    进程管理(二)-进程的终止
    进程管理(一)-进程的概念以及进程的创建
    python爬取b站排行榜
  • 原文地址:https://www.cnblogs.com/x3d/p/6108998.html
Copyright © 2020-2023  润新知