【发布时间】:2020-05-18 18:45:57
【问题描述】:
我正在尝试修改我的学习项目以使用 MVVM 和数据绑定。
项目在这里:https://github.com/Sophon/CriminalIntent/tree/dev
在返工之前,该应用的行为如下:
-
MainActivity承载一个CrimeListFragment,它是Crimes 的RecyclerView
-
CrimeHolder实现 View.OnClickListener 和 onClick() 使用回调函数与Crime的id被点击 -
MainActivity实现回调函数并使用supportFragmentManager启动特定的(用id标识)CrimeDetailFragment - 这种行为可以在 Master 分支中看到。
现在,在返工时,这是我目前所拥有的:
-
list_item.xml使用数据绑定 -
CrimeViewModel有一个属性crime: Crime - 我为
CrimeListFragment的onCreateView()中的绑定充气 -
CrimeHolder类有init { binding.viewModel = CrimeViewModel() } -
CrimeHolder也有bind(crime: Crime),我将crime分配给viewModel的crime -
CrimeListAdapter类自解释 - 在链接的分支 dev 中可以看到此行为
RecyclerView 中的每个犯罪都是可点击的,这意味着list_item.xml 将有android:onClick="@{() -> viewModel.onCrimeClicked()}" 和CrimeViewModel 将有一个函数onCrimeClicked()。
我的问题是:如何在符合 MVVM 架构的同时从 viewmodel 的 onClicked() 开始一个新片段 (CrimeDetailFragment)?
我可以像以前一样在 Holder 中简单地实现 View.OnClickListener,但使用 MVVM 我应该避免 View 中的逻辑 (CrimeListFragment就我而言)。
额外的问题 - 我应该实施哪些其他更改才能获得更多 MVVM?
【问题讨论】:
-
MVVM 架构的重点是将 ViewModel 的关注点与实际视图本身分开,因此从视图模型中打开片段将是一个糟糕的选择。相反,当在回收站视图中单击犯罪时,您应该在视图模型中更改所选犯罪的值,例如
viewModel.setSelectedCrime(selectedCrime)。然后,您的 MainActivity 应该观察您的 viewModel,并且当selectedCrime已更改时,它应该启动CrimeDetailFragment。 -
@RyanSaffer 好的,所以我在 viewModel 类中设置了 LiveData 属性。现在我不太清楚我应该如何开始在 MainActivity 中观察。 MainActivity 如何获得
list_item_crime.xml使用的binding.viewModel? -
我也不太清楚你在说哪个视图模型。每个 RecyclerV 项目都有自己的视图模型,所以我无法观察每个项目。因此,如果您的意思是
CrimeListViewModel,那么我不清楚片段如何知道选择了哪个项目。
标签: android android-fragments kotlin mvvm data-binding