问题标签 [android-viewmodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Lateinit 属性 viewModelFactory 尚未在 Fragment 中初始化
我在我的 android 项目中使用 dagger 2(版本 2.15)进行依赖注入。除了注入 viewModelFactory 一切正常。我无法将它注入我的片段中。
我收到以下错误:
我有 ViewModelModule:
视图模型键
和 ViewModelFactory
虽然我不太明白他们在做什么。
android - Android数据绑定在自定义视图中注入ViewModel
我要关闭这个 stackoverflow 答案https://stackoverflow.com/a/34817565/4052264以将数据对象绑定到自定义视图。然而,在一切都设置好后,我的视图没有用数据更新,而是TextView
保持空白。这是我的代码(简化,为了适合这里)
activity_profile.xml
::
view_profile.xml
:
MyProfileCustomView.kt
:
ProfileViewModel.kt
:
一切正常,API 调用profileManager.profile()
成功,ViewProfileBinding
使用正确的设置成功创建了类。问题是当我这样做时name.postValue(profile.name)
,视图没有更新为profile.name
java - 在这种情况下,哪个语句将首先执行?
我一直在尝试让 Junit 测试等待异步任务完成但被卡住了。假设我们有这样的课程
这是我的测试方法
我面临的问题是该verify
语句之前displayData
在内部类中被调用MyViewModel
并且测试用例失败。我该如何解决这个问题?也欢迎任何其他测试相同功能的方式。
android - MVVM - 使用 RxJava 和 Room 处理 ViewModel 中的 Disposable-s
我尝试在我的 Android 活动中应用 MVVM 模式(我是一个 Android 菜鸟)。
我将 Room 与 RxJava 2 一起使用,例如,这是我的存储库中方法的签名:
在我的ViewModel类中,我引用了存储库和如下代码:
到目前为止一切顺利,表面上看起来一切正常。现在 -subscribe
返回一个Disposable
.
我的问题是:
- 我应该如何处理一次性用品(例如,我可以将它放入复合一次性用品中,并在模型清除后处理复合材料)?
- 如果我不处理它会发生什么?泄漏?为什么?
在我经历的一些示例中,没有处理 Disposable。
更新:我在android-architecture-components中看到了复合一次性用品的使用。
谢谢。
android - 如何使用 Dagger2 在 ViewModels 中注入依赖项
我正在尝试在我现有的项目中实现新架构(MVVM + RxJava2 + Dagger2 + Retrofit)。我已经建立了整个以上架构并在 HomeActivity 上进行了测试。在 HomeViewModel 中注入的依赖项。所以现在我试图在 FollowFragment 的 FollowViewModel 中注入与 HomeViewModel 相同的依赖项,这是 HomeActivity 的容器片段。但是注入的依赖项总是返回 null(不是 Initiziling)。
我正在关注这个项目riggaroo/android-arch-components-date-countdown来注入依赖项,但在这个示例中,只使用活动而不使用片段。所以我不知道发生了什么以及谁在多个 ViewModel 中注入 deps。
以下是一些需要理解的重要类的代码:
AppApplication.class
AppInjector.class
应用组件类
应用模块类
ActivityBuilderModule.class
FragmentBuildersModule.class
ViewModule.class
NetworkModule.class
MyViewModelFactory.class
此类用于创建所有视图模型的实例。我已经调试并发现只有 HomeViewModel 实例正在创建。
现在我创建了从 HomeActivity 调用的 HomeViewModel。哪个工作正常。现在在 FollowFragment 中完成了相同的实现,但不起作用。让我向您展示我如何从 FollowListFragment.class 初始化 FollowViewModel
这是FollowingViewModel.class
这是工作正常的 HomeActivity 和 HomeViewModel 类代码。HomeActivity.class
HomeViewModel.class
android - Android 中的 RecyclerViewAdapter 或 ListAdapter 等 Adapter 与 ViewModel(架构组件)有什么区别?
我仍在学习 Android 编程并试图理解 ViewModel 的概念。视图模型背后的主要动机(在几乎所有的视图模型教程中)是保持数据与生命周期事件无关。我发现 ListView 或 Recyclers 下使用的适配器也提供此功能,因为在新创建的 Activity 中创建的视图使用相同的适配器。我想知道两者之间的确切区别是什么?
根据我目前的理解,ViewModel 能够为 Activity 中的所有视图提供与生命周期无关的数据,但是 Adapter(尽管它们可以提供相同的东西)只能在某些视图上工作。我的理解正确吗?
android - 如何使构造函数中带有 id 参数的 ViewModelFactory 可注入?
我在带有 Dagger 的 Android 中使用 ViewModel 来管理依赖项。我的 ViewModel 将在创建时从 MainActivity 获取一个 id。所以我在这里有这些代码:
在活动中:
我的工厂供应商:
为了工作,我需要向我的模块添加一个参数:
或者我可以直接在组件中做它并使其抽象。在新的 Dagger 中,我可以使用 Dagger 类来制作活动或片段组件。因此,我应该为每个活动创建子组件,并为我应该编写的其他代码创建一个 Builder 和音调。
是否有任何简单和更好的方法来防止这些额外的代码,或者我最好通过在这样的活动中调用一个新工厂来创建我的工厂?:
android - 如何使用 ViewModel 和 LiveData 高效且频繁地查询 Room 数据库?
编辑:我本质上问的是什么。
在 SQLite 中,我可以像这样从我的查询中创建一个游标:
我可以在其中传递不同的列、searchClauses 或 selectionArgs 以通过查询查明我想要的数据。
房间数据库相当于什么?
编辑 2:此外,如果我查询数据库,我会收到一个列表,其中包含存储在数据库中的所有项目。从那里我想创建另一个列表,将项目合并到另一个列表中。例如,如果我在数据库中有三个蓝色项目,我想显示一个带有“蓝色”项目的列表项,它还显示这三个项目的平均售价。因此,新列表将包含所有颜色项目,合并为每种颜色的一个列表项目,以及它们各自的平均售价。
我该怎么做呢?
好的,所以我的应用程序有一个相当大的数据库,其中包含 50 列。大多数列可以采用用户输入定义的各种值。
我将在我的应用程序中以不同的片段(在同一个活动中)显示这些数据,在其中使用 listViews。
因此,我最初的方法是对 Room 进行大量但很小的查询,以便在需要的地方获取所需的数据。但是,在使用 ViewModel/LiveData 架构时,我不知道如何进行这些查询。
例如,在我的 Dao 中,这可能是一个查询:
当我想制作一个显示颜色和平均值的列表时,我会使用它。以售价为例。一个列表项可以有一个项目(例如蓝色)或两种或多种颜色组合(黑色和黄色),所以这就是我需要使用字符串[] 的原因。(我的应用与鞋子/颜色无关,我只是以此为例)..
为了达到这个查询,我必须设置一个带有工厂的 ViewModel对吗?像这样:
}
然后我会像这样查询我的 Activity 或 Fragment 中的数据。我必须将我定义的 colour[] 与我想查询的颜色一起传递给工厂。
这是我的问题/问题所在:
如果我想为我的第一个列表项查询“蓝色”。我的第二个是 {"black","yellow"},然后是我的第三个列表项的其他颜色。每次都要新建一个工厂,然后在 ViewModel 上设置新工厂吗?a 我还能如何检索这些数据?这只是一个小例子:有时我想要平均。按鞋码列出的售价。有时我想按颜色查询最受欢迎的鞋码。
我的真实数据库有 50 列,其中包含大量不同的潜在查询,它们都需要传递不同数量/类型的参数。我怎样才能使所有这些查询来填充不同的 listViews/RecyclerViews 呢?不可能我每次都必须创建一个新工厂并创建数十个 ViewModel 以允许传递的每个参数类型和计数?或者这就像为 SQLite 中的每个查询创建一个新的游标?
基本上,我不知道如何使用 Room 进行这么多的查询。
我的替代想法:
与其进行数百个小查询(如果我知道该怎么做的话),我想我只需查询一次数据库并使用我的 ViewModel 获取所有数据。这会给我一个包含所有数据的列表。
从那里我可以在 for 循环中运行/过滤列表,以查找我想要的内容?
例如:
然后我可以通过相应适配器中的 getter 方法从 Activity 中获取这些列表,然后在那里进行进一步的操作?比如获取按颜色分隔的平均鞋码或平均售价,然后在列表中显示这些平均值?
基本上,当我只需要每个 listView 中非常具体的数据而不是所有数据时,我不确定如何将所有数据提取到多个列表视图中。
android - 与 LiveData 一起使用时,return 语句有什么用
我遵循了这个例子,一个集成的ViewModel
和LiveData
.
我习惯于交流LiveData
,习惯于交流ViewModel
Repository
activity
ViewModel
我想澄清这个问题的困惑很少。
这工作正常,并在 MainActivity 5 秒后显示 Toast 消息。
主要活动
主视图模型
登录存储库
这是我的2个问题。
现在使用每种方法,我都返回了一些类型
LiveData
的数据,但是在返回数据时,没有设置值。我是5秒后设置data.setValue("SomeValue")
的,那么return
这里有什么用,是不是因为方法返回类型的原因,万一发生什么都不做LiveData
在
MainActivity
,我习惯于homeViewModel.getResponseval().observe
观察数据,但在ViewModel
,我没有使用observe
,但 ViewModel 仍在观察,Repository
并且 5 秒后 MainActivity 得到结果。我无法理解这里发生了什么。
android - 如何为父片段和子片段提供相同的 ViewModel 实例
有两个片段:ParentFragment 和 ChildFragment。
ChildFragment
已添加到 的视图中ParentFragment
。
现在使用Dagger2
for Android 有ParentFragmentModule
一个方法:
其中 MyViewModelFactory、MyViewModel、MyViewModelImpl 是在应用程序中创建的简单 ViewModel 逻辑。
ChildFragmentModule 具有以下方法:
这显然是在创建两个单独的实例,ViewModel
因为它们接收两个不同的片段实例。
我们如何让它返回相同的实例,以便在父片段和子片段之间共享数据?
我尝试在 中传递而ParentFragment
不是,但这会导致 Dagger 依赖注入错误。ChildFragment
ChildFragmentModule