Kotlin开发Android应用:Firebase实时数据库数据无法显示
问题解决方案
核心问题1:数据解析逻辑错误
你的代码中fetchWords方法存在致命逻辑判断错误:初始状态下words列表为空,导致if (words.isNotEmpty())分支永远不会执行,words列表始终为空,自然无法显示任何内容。
核心问题2:数据库结构与解析逻辑不匹配
Firebase数据库中words节点存储的是两个独立数组(en和tr),但代码里却试图将每个子节点当作包含id、en、tr的独立Word对象解析,完全不匹配数据库结构,无法生成有效WordModel实例。
修复步骤
- 移除错误的空列表判断:直接清空
words列表再解析数据,无需判断列表是否为空 - 适配数据库结构解析:取出
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 )
额外检查点
- 确认
textViewWord在XML布局中未设置visibility="gone"或invisible - 检查
textViewWord的文字颜色与背景色是否区分明显,避免因颜色一致导致看不见内容 - 运行后查看Logcat,确认
Words list size输出大于0,且显示单词日志输出正确内容
内容的提问来源于stack exchange,提问作者Kader Sutlu
相关产品推荐
相关产品推荐

