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

