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

