【发布时间】:2026-02-03 18:10:02
【问题描述】:
我正在使用 Kotlin 和 Firebase 产品制作 Android 应用。我与 Firestore 成功连接,并且可以成功检索我想要的数据,但我很难在 RecyclerView 中显示它。
当应用程序加载并且用户登录后,我的 Firestore 查询使用用户的 UID 来获取他们的分配列表。使用日志我可以看到当主屏幕加载时,这没有问题。在主屏幕片段中,我有 RecyclerView 的数据绑定并设置我的 ViewModel 以让片段观察返回的 Firestore 数据。
我认为我对 LiveData 的工作原理存在误解,因为如果我点击主屏幕的底部导航图标以触发 UI 刷新,然后列表会填充,我可以根据需要使用该应用程序。因此,我的观察者/LiveData 不能正确设置,因为一旦数据发生变化(空列表到非空列表),它就不会自动刷新。
由于我是编程新手,我确信自己陷入了许多陷阱并且做错了一些事情,但几个月来我一直在通过 * 和 YouTube 寻求有关此问题的帮助。不幸的是,我没有将所有链接保存到每个视频和每个帖子中。
我尝试将 ViewModel 和 Repository/Database 类(单例)调整为不同的效果,目前我处于最佳版本,只需单击一下即可刷新 UI。以前它需要多次点击。
来自数据库类
private val assignments = MutableLiveData<List<AssignmentModel>>()
private fun getUserAssignments(c: ClassModel) {
val assignmentQuery = assignmentRef.whereEqualTo("Class_ID", c.Class_ID)
assignmentQuery.addSnapshotListener { documents, _ ->
documents?.forEach { document ->
val a = document.toObject(AssignmentModel::class.java)
a.Assignment_ID = document.id
a.Class_Title = c.Title
a.Formatted_Date_Due = formatAssignmentDueDate(a)
assignmentMap[a.Assignment_ID] = a
}
}
}
fun getAssignments() : LiveData<List<AssignmentModel>> {
assignments.value = assignmentMap.values.toList().filter {
if (it.Date_Due != null) it.Date_Due!!.toDate() >= Calendar.getInstance().time else true }
.sortedBy { it.Date_Due }
return assignments
}
来自 ViewModel
class AssignmentListViewModel internal constructor(private val myDatabase: Database) : ViewModel() {
private var _assignments: LiveData<List<AssignmentModel>>? = null
fun getAssignments() : LiveData<List<AssignmentModel>> {
var liveData = _assignments
if (liveData == null) {
liveData = myDatabase.getAssignments()
_assignments = liveData
}
return liveData
}
}
来自片段
class AssignmentList : Fragment() {
private lateinit var model: AssignmentListViewModel
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val binding = AssignmentListBinding.inflate(inflater, container, false)
val factory = InjectorUtils.provideAssignmentListViewModelFactory()
model = ViewModelProvider(this, factory).get(AssignmentListViewModel::class.java)
val assignmentAdapter = AssignmentAdapter()
binding.assignmentRecycler.adapter = assignmentAdapter
updateUI(assignmentAdapter)
return binding.root
}
private fun updateUI(adapter: AssignmentAdapter) {
model.getAssignments().observe(this, Observer { assignments ->
if (assignments.isNotEmpty()) adapter.submitList(assignments)
})
}
}
再次,我希望 RecyclerView 在 Firestore 中的数据出现后自动填充,但事实并非如此。在我点击主屏幕按钮之前,屏幕一直是空的。
这些 sn-ps 显示了我最近所做的更改。最初我有 Firestore 查询函数直接返回 LiveData。我还有一个更简单的 ViewModel,比如 fun getAssignments() = myDatabase.getAssignments()。
感谢所有帮助和建议。
【问题讨论】:
标签: android firebase android-fragments kotlin android-livedata