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

嵌套RecyclerView数据显示异常问题排查求助

嵌套RecyclerView数据显示异常问题排查与解决

我一眼就发现了问题的根源——你在OrdersAdapter里只创建了一个OrdersInnerAdapter实例,所有外部的订单条目都共用这同一个内部适配器!

为什么会出现数据错乱?

  • RecyclerView的ViewHolder是复用机制,当滚动列表时,旧的ViewHolder会被重新绑定新的订单数据。
  • 每次调用innerAdapter.setItems(item.cartList)都会覆盖同一个适配器的数据集,这就导致所有正在显示的内部RecyclerView,都会显示最后一次设置的那个订单的商品列表。
  • 初始加载时,多个ViewHolder快速绑定数据、切换数据集,也会造成显示异常。

解决方案:让每个外部ViewHolder拥有独立的内部适配器

修改OrdersAdapter中MainViewHolder的实现,不要共用全局的内部适配器,而是让每个ViewHolder持有自己的适配器实例:

class OrdersAdapter(private val context: Context) : RecyclerView.Adapter<BaseViewHolder<*>>() { 
    // 移除全局的innerAdapter定义

    inner class MainViewHolder(itemView: View) : BaseViewHolder<Order>(itemView) { 
        // 每个ViewHolder专属的内部适配器
        private val innerAdapter = OrdersInnerAdapter(context)

        init {
            // LayoutManager和适配器只初始化一次,避免重复设置
            itemView.rv_order_items.layoutManager = LinearLayoutManager(context)
            itemView.rv_order_items.adapter = innerAdapter
        }

        override fun bind(item: Order, position: Int) { 
            itemView.user_name.text = item.userName 
            // 仅更新当前ViewHolder对应的内部适配器数据
            innerAdapter.setItems(item.cartList) 
        } 
    }

    // 其他原有代码...
}

额外优化:用DiffUtil提升内部列表更新效率

为了让内部列表的更新更流畅,避免全量刷新,可以修改OrdersInnerAdapter的setItems方法,使用DiffUtil来计算数据差异并局部更新:

class OrdersInnerAdapter(val context: Context):RecyclerView.Adapter<BaseViewHolder<*>>(){ 
    private var cartList = mutableListOf<Cart>() 

    fun setItems(newCartList: List<Cart>){ 
        val diffCallback = object : DiffUtil.Callback() {
            override fun getOldListSize() = cartList.size
            override fun getNewListSize() = newCartList.size

            override fun areItemsTheSame(oldPos: Int, newPos: Int): Boolean {
                // 请根据你的Cart类实际情况,用唯一标识判断是否为同一个商品
                return cartList[oldPos].id == newCartList[newPos].id
            }

            override fun areContentsTheSame(oldPos: Int, newPos: Int): Boolean {
                // 比较商品的内容是否完全一致
                return cartList[oldPos] == newCartList[newPos]
            }
        }

        val diffResult = DiffUtil.calculateDiff(diffCallback)
        cartList.clear()
        cartList.addAll(newCartList)
        diffResult.dispatchUpdatesTo(this)
    } 

    // 其他原有代码...
}

这样修改后,每个外部订单条目都有自己独立的内部适配器,数据更新互不干扰,ViewHolder复用也不会再导致数据错乱的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:07:28