android - 如何生成具有临时 subview 的组合 View 模型?

标签 android android-fragments viewmodel android-viewmodel

场景

我有一个测验生成器,它生成一系列不同类别的测验。该序列的长度不受限制。

测验生成器有一个 View 模型。每种类型的测验都有一个 View 模型。测验生成器 View 模型应根据测验的类创建测验的 View 模型。

问题

View 模型不得包含对生命周期的引用,但我需要生命周期来创建 View 模型。

ViewModelProviders.of(lifecycle).get(classForQuizzType);

问题

在哪里创建测验的 subview 模型?

我能想到的一个解决方案是每次从 Activity 中注入(inject) subview 模型。这是一种绕道,特别是在涉及嵌套 View 的情况下。

另一个解决方案是在嵌套 View 中创建 View 模型,这看起来也很难看,因为从 View 内部访问生命周期并不常见。

如果没有干净的解决方案,我的架构方法有什么问题?我应该在这种情况下使用 fragment 吗?

最佳答案

pskink 启发,我自己给出了第一个答案。也许我会在使用建议的方法一些经验后更新答案。

如果 View 模型应生成子对象(即组件),则组件不需要绑定(bind)到生命周期本身,只要主对象绑定(bind)到生命周期并且从主对象引用组件即可。

对于给定的示例,这意味着创建主对象的好位置是 Activity 的顶层位置,其中生命周期可直接使用。测验对象是从主对象引用的。它们不需要直接访问生命周期,并且可以在任何地方创建,例如在主对象内。这使得能够按需创建它们。

组件可能是也可能不是ViewModel的子类。我认为扩展 ViewModel 是一个很好的做法。该父类引入了 onCleared 方法。这是从底层模型中删除观察者的地方。如果不这样做,您可能会造成内存泄漏。

您必须注意在正确的时刻调用 onCleared,至少是从主对象的 onCleared 方法调用。在这种特殊情况下,必须在生成新测验之前清除每个先前的测验,以从基础测验模型中删除引用。

可以使用new关键字简单地创建组件的 View 模型。无需使用工厂或提供商。

关于android - 如何生成具有临时 subview 的组合 View 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894570/

相关文章:

android - Horizo​​ntal ScrollView 中的多个 YouTubePlayerFragments - 所有播放器都显示最后加载的视频

asp.net-mvc-3 - View 中的多个 ViewModel

wpf - ContextMenu 命令绑定(bind)到父级和自身

android - 下载后如何在android的pdf查看器中显示并读取文件

java - 在测量之间创建延迟

android - Google Maps android通过在 map 中移动标记来获取经纬度

android - 使用 Android 的 MediaPlayer 类播放资源视频

android - 如何知道哪个 fragment 称为另一个 fragment ?

android - 膨胀 ListFragment 类时出错

c# - SelectLists 属于 viewModels 吗?