You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin协程使用疑问:如何等待API请求完成后更新RecyclerView?

Kotlin协程结合RecyclerView更新的问题解决

问题背景

我正在学习Kotlin协程的用法,需求是先展示不含特定值的原始数据,再调用API获取缺失值并更新RecyclerView。

最初尝试的代码

userAdapter.submitList(users.data)

users.data.forEachIndexed { index, user ->
    runBlocking {
        val repos = userDetailViewModel.getReposNumber(user.login)
        val followers = userDetailViewModel.getFollowersNumber(user.login)

        val fullUser = user.copy(repos = repos, followers = followers) // repos 和 followers 是 Int 类型
        userAdapter.replaceUser(fullUser, index)
    }
}

但这种方式无法将新值传入fullUser,导致视图没有更新。我想知道如何等待这两个API请求完成后,再向RecyclerView传递新数据。

存在问题的ViewModel方法

我编写的以下两个方法也有问题:

fun getFollowersNumber(login: String) = viewModelScope.launch {
    userUseCase.getFollowers(login).size
}
    
fun getReposNumber(login: String) = viewModelScope.launch {
    userUseCase.getRepositories(login).size
}

解决后的可行代码

感谢建议,将函数改为suspend函数后,代码可以正常运行:

更新后的ViewModel方法

suspend fun getFollowersNumber(login: String) = userUseCase.getFollowers(login).size

suspend fun getReposNumber(login: String) = userUseCase.getRepositories(login).size

更新后的UI层代码

users.data.forEachIndexed { index, user ->
    lifecycleScope.launch {
        val repos = lifecycleScope.async { 
            userDetailViewModel.getReposNumber(user.login) 
        }.await()
        val followers = lifecycleScope.async { 
            userDetailViewModel.getFollowersNumber(user.login) 
        }.await()

        val fullUser = user.copy(repos = repos, followers = followers)

        userAdapter.replaceUser(fullUser, index)
    }
}

内容的提问来源于stack exchange,提问作者KolaYAndr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:10:02