如何在Viewmodel(Java-Android)中实现自定义用户列表

如何在Viewmodel(Java-Android)中实现自定义用户列表,java,android,mvvm,viewmodel,android-livedata,Java,Android,Mvvm,Viewmodel,Android Livedata,我是一个初学者程序员,我正在尝试使用MVVM和最新的Jetpack组件(与本案例相关:Room、Navigation和LiveData)开发一个Android应用程序 我用Room创建了一个用户数据库,在我的一个片段中,我必须显示这些用户的列表,但不是所有用户,只是那些具有特定ID的用户。根据我在应用程序中启动此片段的位置,此列表会发生变化(显示不同的用户) 每次我回到这个片段,它都会被重新创建(据我所知,导航就是这样工作的),但我在想如何避免每次创建视图时从数据库中重新加载数据时出现这个“自定

我是一个初学者程序员,我正在尝试使用MVVM和最新的Jetpack组件(与本案例相关:Room、Navigation和LiveData)开发一个Android应用程序

我用Room创建了一个用户数据库,在我的一个片段中,我必须显示这些用户的列表,但不是所有用户,只是那些具有特定ID的用户。根据我在应用程序中启动此片段的位置,此列表会发生变化(显示不同的用户)

每次我回到这个片段,它都会被重新创建(据我所知,导航就是这样工作的),但我在想如何避免每次创建视图时从数据库中重新加载数据时出现这个“自定义”用户列表的问题,因为否则保存此列表的RecyclerView会“闪烁”当应用程序正在访问数据库时的一瞬间

这就是我在Viewmodel中尝试做的事情(这显然是错误的,但也许它可以帮助您理解我尝试做的事情)

公共类UserViewModel扩展了AndroidViewModel{
私有LiveData自定义用户列表;
私有用户存储库;
public LiveData getUsersForGroup(int-groupId){
if(customUserList!=null){
返回customUserList;
}否则{
customUserList=mUserRepository.getUsersForGroup(groupId);
返回customUserList;
}
}
我可以想出一些“黑客”的方法来做这件事,但必须有一个正确的方法来做

在这种情况下,我应该使用ViewModelFactory吗?如果是这样,我该如何实现它?我找不到关于这方面的很多信息,我发现的是用Kotlin编写的

正确的方法是什么


谢谢。

查询数据库有什么特别的问题?您是否遇到了特定的性能问题?我的意思是,您可以将缓存添加到
用户存储库
,但这可能是过早的优化。您试图说您想为
用户
创建一个
模型类
,该类将具有
Id、 firstName、secondName
以及类似的内容我说的对吗?@Commonware我的问题是,每次加载此片段时(在使用应用程序时总是发生这种情况),应用程序访问数据库时,用户列表的回收器视图“闪烁”半秒。我想找到一种避免这种情况的方法。(例如,如果我从我的Viewmodel中询问完整的用户列表,则不会发生“重新加载”,因为该列表存储在Viewmodel中)。@Spritzig否,我已经创建了model类,它正在工作“用户列表的回收器视图”闪烁半秒钟,而应用程序访问数据库——我不确定“闪烁”是什么在此上下文中是指。如果您的意思是
RecyclerView
为空,则会被填充,并且您正试图避免这种情况……请首先确保您的文件室设置正确。例如,是否设置了索引以处理位于
getUsersForGroup()后面的查询
?查询数据库时特别关注的是什么?您是否遇到了特定的性能问题?我的意思是,您可以将缓存添加到
用户存储库
,但这可能是过早的优化。您试图说您想为
用户
创建一个
模型类
,该类将具有
id,firstName、secondName
以及类似的内容我说的对吗?@commonware我的问题是,每次加载此片段时(在使用应用程序时总是发生这种情况),应用程序访问数据库时,用户列表的回收器视图“闪烁”半秒。我想找到一种避免这种情况的方法。(例如,如果我从我的Viewmodel中询问完整的用户列表,则不会发生“重新加载”,因为该列表存储在Viewmodel中)。@Spritzig否,我已经创建了model类,它正在工作“用户列表的回收器视图”闪烁半秒钟,而应用程序访问数据库——我不确定“闪烁”是什么在此上下文中是指。如果您的意思是
RecyclerView
为空,则会被填充,并且您正在尝试避免这种情况……请首先确保您的文件室设置正确。例如,是否设置了索引以处理位于
getUsersForGroup()后面的查询?