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

Kotlin开发Android应用:Firebase实时数据库数据无法显示

问题解决方案

核心问题1:数据解析逻辑错误

你的代码中fetchWords方法存在致命逻辑判断错误:初始状态下words列表为空,导致if (words.isNotEmpty())分支永远不会执行,words列表始终为空,自然无法显示任何内容。

核心问题2:数据库结构与解析逻辑不匹配

Firebase数据库中words节点存储的是两个独立数组(en和tr),但代码里却试图将每个子节点当作包含id、en、tr的独立Word对象解析,完全不匹配数据库结构,无法生成有效WordModel实例。


修复步骤

  1. 移除错误的空列表判断:直接清空words列表再解析数据,无需判断列表是否为空
  2. 适配数据库结构解析:取出en和tr数组,按索引配对生成WordModel对象

完整修复代码

WordFragment.kt

package com.kader.foxycode_casestudy.Fragment

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.DatabaseReference
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener
import com.kader.foxycode_casestudy.Models.WordModel
import com.kader.foxycode_casestudy.R

class WordFragment : Fragment() {

    private lateinit var textViewWord: TextView
    private lateinit var buttonPrevious: ImageView
    private lateinit var buttonNext: ImageView

    private lateinit var databaseReference: DatabaseReference

    private var words: MutableList<WordModel> = mutableListOf()

    private var currentWordIndex: Int = 0

    private var currentLanguage: String = "English"


    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_word, container, false)

        textViewWord = view.findViewById(R.id.textViewWord)
        buttonPrevious = view.findViewById(R.id.buttonPrevious)
        buttonNext = view.findViewById(R.id.buttonNext)

        val categoryId: String? = arguments?.getString("categoryId")
        if (categoryId != null) {
            Log.d("WordFragment", "CategoryId: $categoryId")
            databaseReference =
                FirebaseDatabase.getInstance("https://foxycodecasestudy-default-rtdb.europe-west1.firebasedatabase.app")
                    .getReference("categories")
                    .child(categoryId)
                    .child("words")
            Log.d("WordFragment", "Database reference: $databaseReference")

            buttonPrevious.setOnClickListener {
                Log.d("WordFragment", "Previous button clicked")
                showPreviousWord()
            }

            buttonNext.setOnClickListener {
                Log.d("WordFragment", "Next button clicked")
                showNextWord()
            }

            fetchWords()
        } else {
            Log.e("WordFragment", "CategoryId is null.")
        }

        return view
    }

    private fun fetchWords() {
        databaseReference.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                Log.d("WordFragment", "OnDataChange.")
                if (dataSnapshot.exists()) {
                    // 清空列表避免重复数据
                    words.clear()
                    
                    // 从数据库取出英文和土耳其文单词数组
                    val enWords = dataSnapshot.child("en").getValue<List<String>>()
                    val trWords = dataSnapshot.child("tr").getValue<List<String>>()
                    
                    // 配对数组元素生成WordModel
                    if (!enWords.isNullOrEmpty() && !trWords.isNullOrEmpty() && enWords.size == trWords.size) {
                        for (i in enWords.indices) {
                            val word = WordModel(id = i.toString(), en = enWords[i], tr = trWords[i])
                            words.add(word)
                        }
                        Log.d("WordFragment", "Words list size: ${words.size}")
                        
                        // 显示第一个单词
                        if (words.isNotEmpty()) {
                            showWord(currentWordIndex)
                        }
                    } else {
                        Log.e("WordFragment", "英文/土耳其文单词列表为空或长度不匹配")
                    }
                } else {
                    Log.e("WordFragment", "DataSnapshot为空")
                }
            }

            override fun onCancelled(databaseError: DatabaseError) {
                val errorMessage = databaseError.message
                Log.e("WordFragment", "Firebase错误: $errorMessage")
            }
        })
    }


    private fun showWord(index: Int) {
        Log.d("WordFragment", "调用showWord,索引: $index")

        if (index in 0 until words.size) {
            val word = words[index]

            Log.d("WordFragment", "单词索引: $index")
            Log.d("WordFragment", "单词ID: ${word.id}")
            Log.d("WordFragment", "英文单词: ${word.en}")
            Log.d("WordFragment", "土耳其文单词: ${word.tr}")

            if (currentLanguage == "English") {
                textViewWord.text = word.en
            } else if (currentLanguage == "Turkish") {
                textViewWord.text = word.tr
            }

            Log.d("WordFragment", "显示单词: ${textViewWord.text}")
        } else {
            Log.e("WordFragment", "无效单词索引: $index")
        }
    }


    private fun showPreviousWord() {
        if (currentWordIndex > 0) {
            currentWordIndex--
            showWord(currentWordIndex)
        }
    }

    private fun showNextWord() {
        if (currentWordIndex < words.size - 1) {
            currentWordIndex++
            showWord(currentWordIndex)
        }
    }
}

WordModel.kt(无需修改)

package com.kader.foxycode_casestudy.Models

data class WordModel(
    val id: String? = null,
    val en: String? = null,
    val tr: String? = null
)

额外检查点

  1. 确认textViewWord在XML布局中未设置visibility="gone"或invisible
  2. 检查textViewWord的文字颜色与背景色是否区分明显,避免因颜色一致导致看不见内容
  3. 运行后查看Logcat,确认Words list size输出大于0,且显示单词日志输出正确内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:45:55