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吗?方法好吗?
是! 您可以.但我认为你的方法会更好.请记住,视图模型不得引用您的视图.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)
在这种情况下,视图观察视图模型,并通知适配器.然后在适配器中,像往常一样进行绑定,而不进行数据绑定.
绝对可能,这完全取决于您如何解释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 及其适配器
归档时间: |
|
查看次数: |
4346 次 |
最近记录: |