问题:我可以在不使用数据绑定的情况下使用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吗? 方法好吗?
答案 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及其适配器