在某些情况下,我想更改 LiveData 的值并且不希望观察者通知更改。我怎样才能做到这一点?
我正在尝试从 Room 获取 LiveData。因此,如果数据库中的任何内容发生更改,我的 RecycleView 可以进行实时更新
我试过不使用 LiveData 并且可以,但是当我添加 LiveData 时总是显示此错误。
error: Not sure how to convert a Cursor to this method's return type (androidx.lifecycle.LiveData<java.util.List<com.example.models.Club>>).
public abstract java.lang.Object getAll(@org.jetbrains.annotations.NotNull()
Run Code Online (Sandbox Code Playgroud)
我在这个网站上用谷歌搜索并查看了解决方案,但每个关于这个问题的人都使用了 rxjava、rxandroid、rxkotlin 或 ArrayList。对于他们来说,解决方案是用 List 替换 ArrayList,让 RX 尝试协程。好吧,我正在使用 Coroutine 和 List,但仍然没有进展。
这是我的ClubDao
ClubDao
@Query("SELECT * FROM club")
suspend fun getAll(): LiveData<List<Club>>
Run Code Online (Sandbox Code Playgroud)
在俱乐部我有这个属性
Club
@Entity
data class Club(@PrimaryKey var id: Int,
@ColumnInfo(name = "logo_url") var logoUrl: String,
@ColumnInfo(name = "name") var name: String,
@ColumnInfo(name = "town") var town: String,
@ColumnInfo(name = …Run Code Online (Sandbox Code Playgroud) android kotlin android-room android-livedata android-viewmodel
块引用
我有单独的类在其中处理数据获取(使用 Room),我通常从中返回 LiveData 对象列表并更新它们。现在我有一个设置类,当我按下“备份”时,我想将返回的数据存储在 ViewModel 中,但问题是为了获取该值,我需要观察对象的 LiveData 列表。我不想观察它,因为我只需要值(对象列表)来执行备份。我试过下面的方法:
道
@Query("SELECT * FROM $DATABASE_TABLE_GOAL")
suspend fun getAllGoals_NotLive(): List<Goal>
Run Code Online (Sandbox Code Playgroud)
视图模型
var goals_NotLive: List<Goal> = ArrayList()
fun getGoalsNotLive(){
_uiScope.launch {
withContext(Dispatchers.IO) {
goals_NotLive = database.goalDao.getAllGoals_NotLive()
}
}
}
Run Code Online (Sandbox Code Playgroud)
活动
fun getGoals(): List<Goal>{
_viewModel.getGoalsNotLive()
return _viewModel.goals_NotLive
}
Run Code Online (Sandbox Code Playgroud)
但它仍然返回大小 0。我该怎么办?
问题介绍:
在使用MediatorLiveDataandroid自带的android jetpack的时候,我发现自己经常从各个源调用同一个函数。例如,这可能是因为,每当更新一个来源时,我都必须检查它是否有影响,或者另一个来源是否更重要。代码示例(Kotlin,但不重要):
val isHovered = MutableLiveData<Boolean>()
val isSelected = MutableLiveData<Boolean>()
val color = MediatorLiveData<Int>().apply {
addSource(isHovered) { updateColor() }
addSource(isSelected) { updateColor() }
}
fun updateColor() {
if (isHovered.value == true)
color.value = Color.GREEN
else if (isSelected.value == true)
color.value = Color.RED
else
color.value = Color.GRAY
}
Run Code Online (Sandbox Code Playgroud)
悬停时项目为绿色,选中时为红色,未悬停时为红色,否则为灰色。当 isSelected 变为 true 时,在将颜色更改为红色之前,我还需要检查它是否处于悬停状态。此外,当 isHovering 更改为 false 时,我需要在将颜色更改为灰色之前检查它是否被选中。所以最简单的是一个函数,它考虑了所有变量并相应地设置颜色。
我的问题:
当 MediatorLiveData 从非活动状态变为活动状态时,因为视图移到了前台updateColor,对于每个更改的源,可能会多次调用该函数。这是不必要的,因为每次调用都已经考虑了所有变量。由于这个函数可能非常复杂并且可能有很多来源,有没有办法避免针对源 LiveDatas 的相同状态多次调用它?
我在Java中有这个代码:
mViewModel.getSetupData().observe(this, this::updateTime);
Run Code Online (Sandbox Code Playgroud)
的注册方法接受一个参数。将此代码转换为 Kotlin 时,以下内容不起作用:
mViewModel?.getSetupData()?.observe(this, ::updateTime)
Run Code Online (Sandbox Code Playgroud)
IDE (android studio) 抱怨
类型不匹配。要求:观察者。找到 KFunction1。
有什么线索吗?
java-8 kotlin android-studio method-reference android-livedata
我很难弄清楚如何在请求的情况下连接我的Repository和ViewModel的实时数据@GET并在片段中观察它们。
当请求类型是@POST因为我可以Transformation.switchMap在主体上使用时,我没有这个问题,并且每当主体更改存储库的函数被调用并向响应实时数据发出值时,就像这样
val matchSetsDetail: LiveData<Resource<MatchDetailBean>> = Transformations.switchMap(matchIdLiveData) { matchId ->
val body = MatchSetRequest(matchId)
repository.getMatchSet(body)
}
Run Code Online (Sandbox Code Playgroud)
但是在@GET请求的情况下,我的视图提供了几个查询参数
我在存储库类中有这个改造 API 调用,代码看起来像这样
class Repository {
fun checkInCheckOutUser(apiKey: String, userId: Int, status: String, latitude: Double, longitude: Double, checkedOn: Long): LiveData<Resource<BaseResponse>> = liveData {
emit(Resource.Loading())
try {
val response: Response<BaseResponse> = ApiClient.coachApi.checkInCheckOutUser(apiKey, userId, status, latitude, longitude, checkedOn)
if (response.isSuccessful && response.body() != null) {
if (response.body()!!.isValidKey && response.body()!!.success) {
emit(Resource.Success(response.body()!!))
} else …Run Code Online (Sandbox Code Playgroud) android kotlin android-livedata android-architecture-components kotlin-coroutines
我的代码
fun weatherByCity(cityName: String): LiveData<Resource<Response>> = liveData(Dispatchers.IO) {
val response = appRepository.weatherByCity(cityName)
emit(response)
}
fun weatherByZipCode(zipCode: String): LiveData<Resource<Response>> = liveData(Dispatchers.IO) {
val response = appRepository.weatherByZipCode(zipCode)
emit(response)
}
fun weatherByLocation(latLong: String): LiveData<Resource<Response>> = liveData(Dispatchers.IO) {
val response = appRepository.weatherByLocation(lat?:"", long?:"")
emit(response)
}
Run Code Online (Sandbox Code Playgroud)
在这里,我使用了三个 liveData{} 块,它们从存储库中获取数据并进行改造。但它们具有相同的返回类型LiveData<Resource<Response>>。我可以对所有三个都使用单个 liveData{},如果是,那么该怎么做?还有一个问题,使用 liveData(Dispatchers.IO) 还是使用 liveData{}(不使用 Dispatchers.IO)会有什么不同?
android kotlin android-livedata mutablelivedata kotlin-coroutines
我最近开始研究 Android 架构组件。我发现 MVVM 架构非常方便,我想掌握它。在设计我的应用程序时,我应该为不同的活动/片段使用多个 ViewModel,还是应该为所有活动/片段使用单个 ViewModel?这两种方法的优缺点是什么?谢谢你。
android mvvm viewmodel android-livedata android-architecture-components
代码 A 用于for (aMovice in listVoiceBySort.value!!)访问 的每个元素LiveData<List<MVoice>>。
但我不认为这是一个好方法,因为它使用listVoiceBySort.value!!,它很丑陋。
是否有访问 的每个元素的好方法LiveData<List<MVoice>>?
代码 A
val listVoiceBySort: LiveData<List<MVoice>> =_listVoiceBySort
fun selectAllIDs(){
for (aMovice in listVoiceBySort.value!!){
selectedIDs.add(aMovice.id)
}
}
Run Code Online (Sandbox Code Playgroud) 在查看 android LiveData 的实现时,我偶然发现了以下代码片段
public T getValue() {
Object data = mData;
if (data != NOT_SET) {
return (T) data;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
为什么要在返回之前将类成员分配给局部变量?我的猜测是它关系到一个事实,即mData是volatile,但我不能完全理解我们为什么不能只return mData。
android-livedata ×10
android ×9
kotlin ×6
android-architecture-components ×2
android-room ×1
event-driven ×1
java ×1
java-8 ×1
mvvm ×1
viewmodel ×1
volatile ×1