android MVVM没有数据绑定

tin*_*ker 8 android mvvm android-databinding rx-java2

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

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

我是如何实施的:

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

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

ViewModel有如下调用:

 void getItems();
 void addItemData();
 void removeItem();
Run Code Online (Sandbox Code Playgroud)

用RXJava2调用服务

 ObServable<ApiResponse> getItems();
 ObServable<ApiResponse> addItemData();
 ObServable<ApiResponse> removeItem();  
Run Code Online (Sandbox Code Playgroud)

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

我不确定这是否适合MVVM.

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

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

Fed*_*and 8

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

注意:这个例子与Kotlin和LiveData有关,为什么不呢?但是你可以把它用在Java和Rx上

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

  fun getAllItems() : LiveData<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
      }
}
Run Code Online (Sandbox Code Playgroud)

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


Mal*_*lte 5

绝对可能,这完全取决于您如何解释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();
}
Run Code Online (Sandbox Code Playgroud)

然后,您的ViewModel仅使用RxJava以非常实用的样式将输入映射到输出。每当收到用户输入时,您就将片段提供给ViewModel。当ViewModel的Output更改时,它订阅Outputs并相应地更新用户界面。 这是一篇详细介绍该主题的博客文章(免责声明:我写的)


小智 -2

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