Android - 带有 ViewPager 的 MVVM
Android - MVVM with ViewPager
我正在尝试使用 MVVM 模式开发我的第一个项目。
我有两个片段:
- MyViewCollection(片段,其中包含可横向滚动片段的列表)。
- MyView(可横向滚动的片段)。
他们每个人都有 ViewModel,它使用数据绑定和实时数据。
我在 MyViewCollection 中有 'Watch later' 按钮,它必须将内容从 MyView 保存到 Room DB。
- MyViewViewModel 将特定数据发送到视图以包含在片段中。
- 'Watch Later' 按钮位于 MyViewCollection 中,因为在可横向滚动的片段上有漂亮的静态按钮。
- 当从 MyViewCollection 中单击按钮时,我必须从 MyView 中获取当前数据,并将其发送到 Room。
我是如何做到的。
我的视图(片段):
Data currentData;
...
viewViewModel.getData().observe(this, data -> {
currentData = data;
...
}
我的视图集合(片段集合):
// on button clicked
viewCollectionViewModel.getIsDataToLoad().observe(this, aBoolean -> {
MyView fragment = (MyView) adapter.getFragmentActivity()
.getSupportFragmentManager()
.findFragmentByTag("f" + currentFragmentPos); // currentFramgentPos from onPageSelected (ViewPager2)
Data data = fragment.currentData;
// async task:
RepositoryDB.getRoomInstance().getDao().insertData(data);
}
所以我有两个问题:
- 这是一个很好的做法,当'Views'在MVVM中'talk'互相? (如果不是 - 在像我这样的情况下如何避免这种情况?)。
- 我知道最佳做法是从 ViewModel 写入 Room,但 ViewModel 不能 'talk' 相互之间以及与 View 之间。那么我必须如何保留来自 'MyView' 的数据,以便将其从 'MyViewCollectionViewModel'(而不是来自 'MyViewViewModel')写入 Room?
最佳做法是在 MyView 中有两个视图模型。第二个视图模型是所有片段之间的共享视图模型,包括 MyViewCollection。你可以在那里存储数据并做你的员工。阅读更多关于 Shared ViewModels
我正在尝试使用 MVVM 模式开发我的第一个项目。
我有两个片段:
- MyViewCollection(片段,其中包含可横向滚动片段的列表)。
- MyView(可横向滚动的片段)。
他们每个人都有 ViewModel,它使用数据绑定和实时数据。
我在 MyViewCollection 中有 'Watch later' 按钮,它必须将内容从 MyView 保存到 Room DB。
- MyViewViewModel 将特定数据发送到视图以包含在片段中。
- 'Watch Later' 按钮位于 MyViewCollection 中,因为在可横向滚动的片段上有漂亮的静态按钮。
- 当从 MyViewCollection 中单击按钮时,我必须从 MyView 中获取当前数据,并将其发送到 Room。
我是如何做到的。
我的视图(片段):
Data currentData;
...
viewViewModel.getData().observe(this, data -> {
currentData = data;
...
}
我的视图集合(片段集合):
// on button clicked
viewCollectionViewModel.getIsDataToLoad().observe(this, aBoolean -> {
MyView fragment = (MyView) adapter.getFragmentActivity()
.getSupportFragmentManager()
.findFragmentByTag("f" + currentFragmentPos); // currentFramgentPos from onPageSelected (ViewPager2)
Data data = fragment.currentData;
// async task:
RepositoryDB.getRoomInstance().getDao().insertData(data);
}
所以我有两个问题:
- 这是一个很好的做法,当'Views'在MVVM中'talk'互相? (如果不是 - 在像我这样的情况下如何避免这种情况?)。
- 我知道最佳做法是从 ViewModel 写入 Room,但 ViewModel 不能 'talk' 相互之间以及与 View 之间。那么我必须如何保留来自 'MyView' 的数据,以便将其从 'MyViewCollectionViewModel'(而不是来自 'MyViewViewModel')写入 Room?
最佳做法是在 MyView 中有两个视图模型。第二个视图模型是所有片段之间的共享视图模型,包括 MyViewCollection。你可以在那里存储数据并做你的员工。阅读更多关于 Shared ViewModels