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
相关产品推荐
相关产品推荐

