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

Kotlin中RecyclerView无法显示Firebase数据求助

Firebase填充RecyclerView无数据显示的问题修复

核心问题拆解

以下是导致RecyclerView空白的几个关键错误:

1. 适配器加载了错误的布局

onCreateViewHolder里你加载的是整个活动的布局R.layout.activity_camiones_activos,而非RecyclerView的列表项布局R.layout.tarjeta_recycler,这会导致每个列表项都渲染成完整页面,自然无法显示数据。

2. 文本赋值用错了运算符

onBindViewHolder中使用的?:是条件取值运算符,并没有把数据赋值给TextView。正确操作应该是直接用=赋值。

3. 数据加载后未通知适配器

从Firestore获取数据并添加到camionList后,没有调用适配器的notifyDataSetChanged()方法,适配器不知道数据已更新,不会触发RecyclerView刷新。

4. 额外注意:数据类的序列化要求

datos类必须有无参构造函数,且字段名(如Placa、Peso)要和Firestore文档中的字段完全一致(大小写敏感),否则Firestore无法将文档正确转换为对象。


修改后的完整代码

适配器代码(AdaptadorCamiones)

class AdaptadorCamiones(private val camionlist: ArrayList<datos>)
    : RecyclerView.Adapter<AdaptadorCamiones.MyViewHolder>() {
    class MyViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
        val placa : TextView? = itemView.findViewById(R.id.tvPlacaDato)
        val peso: TextView? = itemView.findViewById(R.id.tvPesoDato)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        // 改为加载列表项布局
        val itemView = LayoutInflater.from(parent.context)
            .inflate(R.layout.tarjeta_recycler, parent, false)
        return MyViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // 直接赋值替换错误的运算符
        holder.placa?.text = camionlist[position].Placa
        holder.peso?.text = camionlist[position].Peso
    }

    override fun getItemCount(): Int {
        return camionlist.size
    }
}

活动代码(CamionesActivos)

class CamionesActivos : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView
    private lateinit var camionList: ArrayList<datos>
    private lateinit var adapter: AdaptadorCamiones // 保存适配器实例方便调用
    private var db = Firebase.firestore

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_camiones_activos)
        recyclerView = findViewById(R.id.rvCamioness)
        recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        camionList = arrayListOf()
        adapter = AdaptadorCamiones(camionList)
        recyclerView.adapter = adapter

        db = FirebaseFirestore.getInstance()
        db.collection("Camiones")
            .get()
            .addOnSuccessListener { querySnapshot ->
                if (!querySnapshot.isEmpty) {
                    camionList.clear() // 清空旧数据避免重复加载
                    for (document in querySnapshot.documents) {
                        val camion: datos? = document.toObject(datos::class.java)
                        camion?.let { camionList.add(it) }
                    }
                    // 通知适配器数据更新
                    adapter.notifyDataSetChanged()
                }
            }
            .addOnFailureListener { exception ->
                Toast.makeText(this, "加载失败:${exception.message}", Toast.LENGTH_SHORT).show()
            }
    }
}

数据类示例(datos)

确保符合Firestore序列化要求:

data class datos(
    val Placa: String? = null,
    val Peso: String? = null
    // 其他字段按Firestore文档添加
) {
    // 必须提供无参构造函数
    constructor() : this(null, null)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:16