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

Android双API数据合并展示RecyclerView遇类型不匹配错误

解决API数据合并与ViewModel类型不匹配问题

1. 确认模型类定义

先确保SocialMediaData包含UsersData的全字段和PostData的指定字段,示例如下:

data class UsersData(
    val item_id: String,
    val item_name: String
)

data class PostData(
    val item_id: String,
    val item_price: String
)

data class SocialMediaData(
    val item_id: String,
    val item_name: String,
    val item_price: String? // 允许为空,兼容API2无匹配数据的场景
)

2. 修正ViewModel的数据合并逻辑

在fetchUsers方法中,并行获取两个API数据后,正确构建合并后的列表,再用Resource包装后发送:

class ParallelNetworkCallsViewModel : ViewModel() {
    // 明确LiveData的泛型为Resource<List<SocialMediaData>>
    val allDatasFromApi = MutableLiveData<Resource<List<SocialMediaData>>>()

    fun fetchUsers() {
        viewModelScope.launch {
            allDatasFromApi.postValue(Resource.Loading())
            try {
                // 并行发起两个API请求
                val (usersList, postsList) = coroutineScope {
                    val usersDeferred = async { apiService.getUsers() }
                    val postsDeferred = async { apiService.getPosts() }
                    Pair(usersDeferred.await(), postsDeferred.await())
                }

                // 将PostData转为以item_id为键的Map,提升匹配效率
                val postMap = postsList.associateBy { it.item_id }

                // 遍历UsersData,匹配对应PostData的指定字段,生成合并列表
                val mergedDataList = usersList.map { user ->
                    val matchedPost = postMap[user.item_id]
                    SocialMediaData(
                        item_id = user.item_id,
                        item_name = user.item_name,
                        item_price = matchedPost?.item_price ?: "" // 无匹配时设默认值
                    )
                }

                // 用Resource.Success包装列表后发送
                allDatasFromApi.postValue(Resource.Success(mergedDataList))
            } catch (e: Exception) {
                allDatasFromApi.postValue(Resource.Error(e.message ?: "未知错误"))
            }
        }
    }
}

3. 解决类型不匹配问题

之前的错误是因为直接传入了单个SocialMediaData对象,现在通过map方法生成完整的List<SocialMediaData>,再用Resource.Success包装后传入postValue,完全符合Resource<List<SocialMediaData>>的类型要求。

4. 修复ArrayList.post()失效问题

你提到的arraylist.post()无法正常工作,核心原因是LiveData的泛型是Resource<List<...>>,不能直接发送原始ArrayList。正确做法是将ArrayList包装到Resource的Success状态中,通过allDatasFromApi.postValue()发送,观察者才能正确接收并处理列表数据。

5. RecyclerView适配层处理

在Activity/Fragment中观察LiveData,根据Resource状态更新UI:

viewModel.allDatasFromApi.observe(this) { resource ->
    when (resource) {
        is Resource.Loading -> {
            // 显示加载状态UI
        }
        is Resource.Success -> {
            // 更新RecyclerView适配器数据
            adapter.submitList(resource.data)
        }
        is Resource.Error -> {
            // 显示错误提示
        }
    }
}

内容的提问来源于stack exchange,提问作者Bell Pepper Medialabs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:20:56