RecyclerView提示No adapter attached; skipping layout问题求助(附代码)
解决RecyclerView提示“No adapter attached; skipping layout”问题
这个错误的核心原因是:RecyclerView完成第一次布局时,还没有被设置Adapter。因为Firebase加载数据是异步操作,onProductsLoadSuccess会在数据加载完成后才执行,此时RecyclerView已经完成了初始布局流程,所以会抛出这个警告。
修复步骤:
提前初始化空Adapter并绑定到RecyclerView
在Activity的初始化方法中,先创建一个空数据的Adapter并设置给RecyclerView,确保布局时Adapter已存在:private lateinit var productsAdapter: ProductsAdapter private fun init() { productsLoadListener = this val gridLayoutManager = GridLayoutManager(this,1) rv_produk.layoutManager = gridLayoutManager // 提前绑定空适配器 productsAdapter = ProductsAdapter(this, emptyList()) rv_produk.adapter = productsAdapter rv_produk.addItemDecoration(SpaceItemDecoration()) }给Adapter添加数据更新方法
修改Adapter,允许动态更新数据源并通知RecyclerView刷新:class ProductsAdapter( private val context: Context, private var list: List<Products> // 将val改为var,支持修改 ): RecyclerView.Adapter<ProductsAdapter.ProductsViewHolder>() { // 添加数据更新方法 fun updateList(newList: List<Products>) { list = newList notifyDataSetChanged() } // 其余代码保持不变... }数据加载完成后更新Adapter数据
在onProductsLoadSuccess中,不再重新创建Adapter,而是调用更新方法:override fun onProductsLoadSuccess(productsModelList: List<Products>?) { productsModelList?.let { productsAdapter.updateList(it) } }
额外优化建议:
避免使用!!强制非空断言,改用安全调用或空判断,减少空指针风险:
override fun onBindViewHolder(holder: ProductsViewHolder, position: Int) { val product = list[position] Glide.with(context) .load(product.image) .into(holder.gambarProduk ?: return) holder.namaProduk?.text = product.name holder.hargaProduk?.text = "Rp${product.price}" }
内容的提问来源于stack exchange,提问作者haainips
相关产品推荐
相关产品推荐

