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

RecyclerView多级数据适配报错:无法将mSubTOP转为ArrayList

解决多级RecyclerView的类型转换错误问题

你遇到的核心问题是数据类型不匹配:子适配器adapter_sub期望接收ArrayList<mSubTOP>,但你实际传入的是单个mSubTOP对象,这直接导致了model cannot be cast to java.util.ArrayList的报错。我们一步步拆解解决:

错误根源分析

先梳理你的数据逻辑:

  • JSON里每个顶级项的sub是单个对象(比如{"warna" : "merah", "jenis" : "air"}),并非数组结构
  • 对应的数据模型mTOP中,sub字段也定义为单个mSubTOP对象
  • 但你在adapter_top的onBindViewHolder里,强行把单个mSubTOP转成ArrayList<mSubTOP>,类型完全不匹配,自然报错

解决方案一:适配当前单对象sub结构(推荐,符合你的JSON格式)

我们修改子适配器,让它支持单个mSubTOP对象的展示:

1. 修改子适配器adapter_sub

将构造函数参数从数组改为单个对象,并调整数据绑定逻辑:

class adapter_sub(val subData: mSubTOP) : RecyclerView.Adapter<adapter_sub.ViewHolder>() {

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        // 直接使用单个sub对象赋值
        holder.tvWarna.text = subData.warna
        holder.tvJenis.text = subData.jenis
    }

    // 单个对象固定返回1条数据
    override fun getItemCount(): Int = 1

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvWarna: TextView = itemView.findViewById(R.id.tv_warna)
        val tvJenis: TextView = itemView.findViewById(R.id.tv_jenis)
    }
}

2. 修正adapter_top的子适配器初始化代码

去掉不必要的强制类型转换,直接传入单个sub对象:

override fun onBindViewHolder(holder: adapter_top.ViewHolder, position: Int) {
    holder.tvHeader?.text = Datane[position].header
    holder.rvList?.layoutManager = LinearLayoutManager(holder.rvList.context, LinearLayout.VERTICAL, false)
    // 直接传入单个sub对象,无需强转
    val adapterSub = adapter_sub(Datane[position].sub)
    holder.rvList?.adapter = adapterSub
}

解决方案二:如果需要sub为多数据数组(调整JSON和模型)

如果你原本希望每个顶级项对应多个子数据,需要先调整数据结构:

1. 修改JSON结构(将sub改为数组)

[
    { 
        "header" : "buah air", 
        "sub" : [{"warna" : "merah", "jenis" : "air"}] 
    },
    { 
        "header" : "buah serat", 
        "sub" : [{"warna" : "hijau", "jenis" : "serat"}] 
    }
]

2. 更新数据模型mTOP的sub字段类型

将sub从单个对象改为列表类型:

data class mTOP ( 
    val header : String, 
    @SerializedName("sub") val sub : List<mSubTOP> 
)

3. 调整adapter_top的代码

现在可以直接将sub列表传给子适配器:

override fun onBindViewHolder(holder: adapter_top.ViewHolder, position: Int) {
    holder.tvHeader?.text = Datane[position].header
    holder.rvList?.layoutManager = LinearLayoutManager(holder.rvList.context, LinearLayout.VERTICAL, false)
    // 将List转为ArrayList传入(或修改子适配器接收List类型)
    val adapterSub = adapter_sub(ArrayList(Datane[position].sub))
    holder.rvList?.adapter = adapterSub
}

两种方案都能解决类型转换错误,你可以根据实际业务需求选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:20:12