标签: android-livedata

如何更改 LiveData 的值而不通知观察者

在某些情况下,我想更改 LiveData 的值并且不希望观察者通知更改。我怎样才能做到这一点?

android android-livedata

2
推荐指数
2
解决办法
2586
查看次数

如何从 Room 获取 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

2
推荐指数
1
解决办法
4414
查看次数

Android:如何在不观察的情况下从 LiveData 中获取价值

块引用

我有单独的类在其中处理数据获取(使用 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。我该怎么办?

android kotlin android-livedata

2
推荐指数
1
解决办法
4061
查看次数

如何避免调用相同函数的 MediatorLiveData 的所有来源?

问题介绍: 在使用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 的相同状态多次调用它?

android event-driven android-livedata android-jetpack

2
推荐指数
1
解决办法
2863
查看次数

如何将 Java 方法参考代码转换为 Kotlin

我在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

2
推荐指数
1
解决办法
489
查看次数

如何通过 ViewModel 从 Fragment 观察 Repository LiveData

我很难弄清楚如何在请求的情况下连接我的RepositoryViewModel的实时数据@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

2
推荐指数
1
解决办法
2073
查看次数

在 Dispatchers.IO 线程上使用 liveData{} 协程构建器

我的代码

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

2
推荐指数
1
解决办法
2063
查看次数

为什么我们将每个 Activity/Fragment 的 ViewModel 分开?

我最近开始研究 Android 架构组件。我发现 MVVM 架构非常方便,我想掌握它。在设计我的应用程序时,我应该为不同的活动/片段使用多个 ViewModel,还是应该为所有活动/片段使用单个 ViewModel?这两种方法的优缺点是什么?谢谢你。

android mvvm viewmodel android-livedata android-architecture-components

2
推荐指数
1
解决办法
493
查看次数

如何使用 Kotlin 访问 LiveData&lt;List&lt;MVoice&gt;&gt; 的每个元素?

代码 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 kotlin android-livedata

2
推荐指数
1
解决办法
192
查看次数

为什么在返回之前将 volatile 分配给局部变量

在查看 android LiveData 的实现时,我偶然发现了以下代码片段

public T getValue() {
        Object data = mData;
        if (data != NOT_SET) {
            return (T) data;
        }
        return null;
    }
Run Code Online (Sandbox Code Playgroud)

为什么要在返回之前将类成员分配给局部变量?我的猜测是它关系到一个事实,即mDatavolatile,但我不能完全理解我们为什么不能只return mData

java android volatile android-livedata

2
推荐指数
1
解决办法
58
查看次数