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

如何解决Kotlin中RecyclerView适配反序列化JSON数据的类型不匹配问题

正确实现RecyclerView展示搜索结果的方式

你最初的适配器写法其实是正确的,错误根源是混淆了RecyclerView适配器的泛型参数和构造参数,误以为要传入List<ViewHolder>,这完全是对适配器工作逻辑的误解。

1. 恢复适配器的正确参数类型

把适配器的声明改回最开始的写法,构造参数接收你的业务数据列表List<searchResults>,泛型参数指定ViewHolder类型即可:

class resultsAdapter(var searchObject: List<searchResults>) : RecyclerView.Adapter<resultsAdapter.resultsViewHolder>() {

    inner class resultsViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView){
        val name: TextView = itemView.findViewById(R.id.nameResult)
        val description: TextView = itemView.findViewById(R.id.descriptionResult)
        val website: TextView = itemView.findViewById(R.id.websiteResult)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): resultsViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.rowlayout, parent, false)
        return resultsViewHolder(view)
    }

    override fun getItemCount(): Int {      
        return searchObject.size
    }

    override fun onBindViewHolder(holder: resultsViewHolder, position: Int) {
        val currentItem = searchObject[position]
        holder.name.text = currentItem.name
        holder.description.text = currentItem.description
        holder.website.text = currentItem.website
    }
}

这里要明确:RecyclerView.Adapter<resultsViewHolder>中的泛型是告诉系统这个适配器用的是哪种ViewHolder,而构造参数是传递要展示的实际数据,两者不要搞混。

2. (推荐)优化数据更新逻辑

如果后续需要更新搜索结果(比如用户输入新关键词后重新查询),建议不要直接修改searchObject的引用,而是添加专门的更新方法,同时可以用更高效的方式通知RecyclerView刷新:

class resultsAdapter(private var searchObject: List<searchResults>) : RecyclerView.Adapter<resultsAdapter.resultsViewHolder>() {
    // ... 其他代码不变

    fun updateData(newData: List<searchResults>) {
        searchObject = newData
        // 简单场景用notifyDataSetChanged,复杂场景建议用DiffUtil做局部刷新
        notifyDataSetChanged()
    }
}

更新数据时只需调用:

adapter.updateData(newSearchResults)

3. 验证反序列化结果

确保你的反序列化逻辑正确加载了数据,可以在获取searchObject后打印日志验证:

val searchObject: List<searchResults> = result.hits.deserialize(searchResults.serializer())
Log.d("SearchDebug", "加载到${searchObject.size}条结果")

如果日志显示数量为0,要检查result.hits的格式是否和searchResults实体类匹配,或者反序列化的方法是否正确。

4. 补充RecyclerView基础配置

别忘了给RecyclerView设置LayoutManager,否则即使数据正确也不会显示:

recyclerView.layoutManager = LinearLayoutManager(this) // 线性布局,也可以用GridLayoutManager等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:23:15