问题标签 [android-mvvm]
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 - MVVM LiveData 和 DataBinding
我正在研究架构组件,现在我正在学习 LiveData 和数据绑定。我可以将 LiveData 与整数值的布局绑定,但我无法找到用户列表。
这是带有数据绑定的 LiveData 的一个工作示例
ViewModel 类和活动
对于上面的示例,数据绑定数据工作正常。计数器更新,但与文档状态不同,它不会在应用程序停止或 LiveData 时停止计数
注意: LiveData 对象仅在活动或 LifecycleOwner 处于活动状态时发送更新。如果您导航到其他应用程序,日志消息会暂停,直到您返回。LiveData 对象仅在其各自的生命周期所有者为 STARTED 或 RESUMED 时才将订阅视为活动的。
我真正的问题是如何用一个LiveData<List<User>>
类来实现数据绑定。
android:text="@{viewModel.getUserRecords()在开始时将用户数据绑定为字符串,但当新用户添加或列表被打乱时它不会更新,除非设备旋转。
活动
编辑:我在 Blackbelt 的回答之后编辑了 MyViewModel 类现在我进入 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observeForever(android.arch.lifecycle.Observer)' on a null object reference
System.out.println()
里面没有被调用,其他 2 被调用并且apply()
不返回null和users
users.getValue()
android - 无法创建视图模型实例
您好,我是 android 中的 MVVM 新手并使用 livedata。我正在尝试创建我的视图模型的实例。我觉得问题是我没有将我的存储库传递给我的视图模型构造函数。我一直无法创建视图模型的实例。我不确定如何在此处执行此操作,这是我的视图模型及其创建。
android - todo-mvvm-xxx - 视图模型之间的通信
问题:
我的活动在屏幕中间有共享按钮、共享标题、共享进程栏和容器,其中片段被替换。
所以我有活动的视图模型 - ActivityViewModel ,其中有以下可观察的:
并且在调用 FragmentViewModel 的片段之间存在共享视图模型。所有片段都使用相同的视图模型
现在的问题是片段的视图模型如何访问活动的视图模型?例如,当用户单击登录按钮时,我希望 fragmentviewmodel 可以访问活动的加载程序,然后导航到下一个屏幕。
或者例如在输入有效时启用按钮
所以这就是我在这些之间进行交流的方式:
我让片段的视图模型来扩展活动的视图模型有点像基本视图模型
所以这是活动的视图模型
公开课 IntroViewModel : BaseViewModel() {
} 这是片段
并且在每个片段内部,我将活动的视图模型绑定到片段的视图模型
它很讨厌,我真的不喜欢它。你能帮我吗?
android - Android MVVM - 如何让 LiveData 发出它拥有的数据(强制触发观察者)
我有这个ViewModel
从网络获取列表并RecyclerView
用数据填充 a (MyAvailabilityRepository
返回 a MutableLiveData
,这就是我使用的原因Transformations.switchMap
):
片段的onActivityCreated
:
由于getListParams.value
第一次为null,它将设置getListsParams.value = organizationId
并触发switchMap
并调用存储库以从网络中获取列表。
当我想强制刷新(通过pull-to-refresh)并再次调用网络时,我可以使用forceRefresh = true
:
它将设置值organizationId
并触发转换,然后调用网络。
但是,我有一个场景,我从 RecyclerView 的适配器中清除数据。如果在那之后,用户单击一个按钮,我想再次触发观察者,以便我使用 getListsObservable 已经获取的数据重新填充适配器。我不想在这个上调用 forceRefresh,因为我确定我已经有了数据,我只想再次触发观察者,以便使用现有数据更新我的 UI。由于getListParams.value
此时不为空,所以当我fetchLists(organizationId)
稍后调用时不会发生任何事情。
知道如何使用当前设置实现这一目标吗?
android - 如何将 app:items="@{viewModel.items}" 属性与 RecyclerView、MVVM 和数据绑定一起使用?
RecyclerView有一个app:items=""
属性,这个属性如何与 MVVM 和 MVVM 一起使用,而android.arch.lifecycle.ViewModel
不是扩展 BaseObservable 的 ViewModel?items
可以是 LiveData、List 或 ObservableArrayList,应该与哪个集合一起使用?
android - 使用匕首 2 注入视图模型依赖项
我在将依赖项注入我的 viewModel 时遇到问题。我不断收到无法创建类 ....viewModel.UserProfileViewModel 的实例。我一直在试图弄清楚这个问题。任何建议将不胜感激。这是我的代码。我在其他问题中看到,这通常是由于在视图模型的构造函数中有一个参数,创建一个工厂应该可以解决这个问题。但这对我来说似乎效果不佳。我肯定错过了什么。
谢谢!
堆栈跟踪 22:08:49.677 19211-19211/nonso.android.nonso E/AndroidRuntime:致命异常:主进程:nonso.android.nonso,PID:19211 java.lang.RuntimeException:无法创建类 nonso.android 的实例.nonso.viewModel.UserProfileViewModel 在 android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:153) 在 android.arch.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:210) 在 android.arch.lifecycle .ViewModelProvider.get(ViewModelProvider.java:134) 在 android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) 在 nonso.android.nonso.ui.fragments.ProfileFragment.setUp(ProfileFragment.java:133) 在android 上的 nonso.android.nonso.ui.fragments.ProfileFragment.onActivityCreated(ProfileFragment.java:122)。support.v4.app.Fragment.performActivityCreated(Fragment.java:2355) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1451) 在 android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager. java:1759) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827) 在 android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) 在 android.support.v4.app .FragmentManagerImpl.executeOps(FragmentManager.java:2596) 在 android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383) 在 android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338) 在android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245) 在 android.os.Handler.handleCallback(Handler.java:790) 在 android.os.Handler.dispatchMessage(Handler.java: 99) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android .internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 原因:java.lang.InstantiationException: java.lang.Class在 android.arch.lifecycle 的 android.arch.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:151) 的 java.lang.Class.newInstance(Native Method) 没有零参数构造函数。ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:210) at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:134) at android.arch.lifecycle.ViewModelProvider.get(ViewModelProvider.java:102) at nonso.android .nonso.ui.fragments.ProfileFragment.setUp(ProfileFragment.java:133) 在 nonso.android.nonso.ui.fragments.ProfileFragment.onActivityCreated(ProfileFragment.java:122) 在 android.support.v4.app.Fragment.performActivityCreated (Fragment.java:2355) 在 android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1451) 在 android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759) 在 android.support。 v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827) 在 android.support。v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) 在 android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596) 在 android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java: 2383)在 android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245) 在 android.support.v4.app.FragmentManagerImpl $1.run(FragmentManager.java:703) 在 android.os.Handler.handleCallback(Handler.java:790) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper .java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 的 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 调用(本机方法)
java - 如何进行活动以显示从服务获取的数据?
我需要编写一个服务,它将每 30 秒更新一次 MainActivity 中的列表。我将 MVVM 与 ViewModel 和 LiveData 一起使用,因此我的 Service 类如下所示:
我的通知类:
当 JobService 中的 Onchanged 起作用时,我会得到列表并显示通知。通知会打开 MainActivity,它会像往常一样对 api 进行新的调用。为了让 MainActivity 显示我从服务中获得的列表,我必须进行哪些更改???我真的不能把它绑在一起。我听说过 IPC,但不会那样做,我想要一些我确实存在但我不知道的更简单的做法。另外,有两种情况:通知来了并且 MainActivity 已打开,应用程序已打开但 MainActivity 不在前台,应用程序在后台或关闭。我应该如何处理这些情况?
另请参阅 MainActivity onCreate 中的一段代码:
请提供此任务的最佳实践,我知道这很常见,我只是第一次这样做,使用 LiveData 使它变得更加复杂。
这里也是存储库代码:
android - ViewModel 中的 ObservableField 值不会使用数据绑定更新 UI
ObservableField<Marker>
ViewModel
使用 in 布局更改类值内的值EditText
,但值不会传播到 TextView tv_summary
。
这是布局
视图模型类
Activity 的 onCreate 方法,用于添加标记以设置值
android - 在 ViewModel 和 Fragment/Activity 交互和通信之间应用 MVVM
我投入了大量时间来正确理解架构组件以及一切如何适应 MVVM 模式。到目前为止,这是我的看法(没有进行 Dagger 注入,因为我还没有做到这一点):
a)UserEntity
是一个带有@Entity
注释的类,用于处理Room
的表创建
b)User
模型中的 pojo 类以在应用程序周围使用它,并根据需要具有补充字段。
除此之外,根据我对 db 的需要,可以有不同的 pojo,例如,UserWithRoles
c)UserDao
负责在房间数据库中获取或插入/更新信息。在这里,对于@Insert
,@Update
我可以使用,UserEntity
但是对于@Query
我也可以使用 pojo 类
d)RepositoryUser
作为 ViewModel 和 Dao 之间的存储库
e)UserWithRolesViewModel
可用于显示用户及其角色列表的片段
f)在我的片段中,我可以执行以下操作:
但是,有些部分是缺失的。根据我对 MVVM 的理解,视图应该只负责显示信息,因此在片段或活动中没有实际的逻辑甚至处理。在这一点上,我有两个问题:
- 通常,我会创建一个接口,例如
onFragmentAction
并在activity
. 然后fragment
当我想通知活动做某事时,我会做callback.onFragmentAction(params)
,onFragmentAction
活动中的 会触发并采取相应的行动。这种情况在 MVVM 中是如何处理的?片段如何与其父活动对话? - 在常规方式中,我将在片段内部
onCreateView
,膨胀布局,用于findViewById
获取视图并使用,例如 textView.setText() 或 button.setOnClickListener()。如何在 MVVM 中做到这一点?使用数据绑定?
android - Android如何处理mvvm架构中的recyclerview点击
我想处理我的 recyclerview 行中的点击,并且当前将我的演示者传递给我的视图绑定。
演示者界面:
观众:
在我的布局中,我在 onClick 属性上调用了我的演示者的方法
我认为传递演示者不是一个好的设计,但是有什么更好的方法来处理从在我的演示者中触发一个方法的行的点击?