android MVVM没有数据绑定

时间:2018-01-17 03:07:42

标签: android mvvm rx-java2 android-databinding

问题:我可以在不使用数据绑定的情况下使用MVVM实现Android应用程序。

我想解决的问题非常简单: 从后端API读取项目列表并在Recylerview中显示它们。

我如何实施:

在视图中 - 我有Activity和RecyclerViewAdapter 型号:ApiResponse和数据模型 network - 改造API服务,RxJava2

对于ViewModel部分 - 我有一个ViewModel类(它不能从任何东西派生)基本上调用Retrofit Service并使用RxJava调用获取数据。

ViewModel有如下调用:

 void getItems();
 void addItemData();
 void removeItem();

将RXJava2的服务称为

 ObServable<ApiResponse> getItems();
 ObServable<ApiResponse> addItemData();
 ObServable<ApiResponse> removeItem();  

View实例化ViewModel对象。    ViewModel在创建期间获取Adapter对象的实例。    在视图中,单击按钮会调用Activity中的ClickHandler,该ClickHandler调用ViewModel#getItems()方法。由于ViewModel具有到Adapter的链接,因此viewModel会更新适配器中的项目,以便RecyclerView自动更新。

我不确定这是否适合MVVM。

数据绑定对我来说有点像意大利面。

同样,我们可以在没有DataBinding的情况下在android中实现MVVM吗? 方法好吗?

5 个答案:

答案 0 :(得分:7)

是的!您可以。但我认为你的方法会更好。 请记住,视图模型不得引用您的视图。 ViewModel公开了可观察对象,在您的视图中,您应该观察这些可观察对象并对更改做出反应。 你可以这样:

注意:此示例与Kotlin和LiveData有关,为什么不呢?但你可以把它与Java和&amp; Rx

ItemsViewModel : ViewModel() {
  private val items = MutableLiveData<List<Items>>()

  fun getAllItems() : List<Items> {
      return items
    }

   //..
}

ItemsActivity : Activity() {
  private var itemsAdapter: ItemsAdapter? = null
  private var viewModel: ItemsViewModel? = null

  override fun onCreate(savedInstance: Bundle) {
  // ...

   // Create your Adapter
   itemsAdapter = ItemsAdapter()
   recyclerView.adapter = itemsAdapter

   // Create and observe your view model
   viewModel =  ViewModelProviders.of(this).get(ItemsViewModel::class.java)

   viewModel.getAllItems().observe(this, Observer {
      it?.let {
          adapter?.datasource = it
      }
}

在这种情况下,视图会观察视图模型,并通知适配器。然后在你的适配器中,像往常一样进行绑定,而不进行数据绑定。

答案 1 :(得分:4)

绝对可能,完全取决于你如何解释MVVM的“绑定”部分。在我们的团队中,我们使用MVVM和RxJava而不是Android数据绑定。 您的ViewModel有一个带有输出和输入的接口,如下所示:

interface TasksViewModel {
        // inputs
        Observer<Task> taskAddedTrigger();
        Observer<Task> taskClickedTrigger();
        Observer<Task> taskCompletedTrigger();

        // outputs   
        Observable<Boolean> isLoading();
        Observable<List<Task>> tasks();
}

然后,您的ViewModel只使用RxJava以非常实用的方式将输入映射到输出。 只要收到用户输入,您就会将片段输入提供给ViewModel。当ViewModel的输出发生变化时,它会订阅输出并相应地更新用户界面。 Here is a blog post详细介绍了该主题(免责声明:我写过)

答案 2 :(得分:1)

MVVM的显着特点是ViewModel没有直接耦合到View(实际上,您可以将ViewModel绑定到不同的布局)。这也对单元测试的简易性产生影响。通过引用Adapter,它在技术上更像MVC。您不必使用数据绑定,但对于真正的MVVM,我认为您需要另一个Observer Pattern机制来通知View,以便它可以提取所需的数据。

答案 3 :(得分:0)

您的说法Since ViewModel has a link to Adapter,这是问题,因为ViewModel不应该引用视图,并且在您的适配器中,您有视图,所以通过执行此操作您根本不关注MVVM!

您仍然可以在没有数据绑定的情况下使用MVVM,但是您需要某种方式来通知视图有关数据更改的信息,它可以是LiveData(首选方式),Java Observable,Rx甚至是自定义实现。视图将收到有关更改和更新本身的通知,在您的情况下,视图将更新适配器。

请在此处查看我的答案Are actions allowed in MVVM? Android

答案 4 :(得分:-1)

我认为您应该使用数据绑定来通知从网络或数据库更改的数据,您的viewmodel应该公开需要或更新数据的方法,当数据到达时您可以对数据执行某些操作,并将它们发布到您的容器中(活动或片段),在那里你可以更新您的RecyclerView及其适配器