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

