【问题标题】:Mutable List not updating when adding list elements from within onSuccessListener从 onSuccessListener 中添加列表元素时,可变列表未更新
【发布时间】:2020-12-08 21:28:30
【问题描述】:

我正在尝试从 firestore 数据库集合中读取所有文档,并将结果传递给我的“消息”对象的可变列表,以便在我的 Recycler 视图适配器中使用,但是 .add() 方法不起作用并且在 OnSuccessListener 中修改列表时不受影响希望一些帮助

private fun getMessages(){
    messageCollecion.get()
        .addOnSuccessListener { documents->
            for(document in documents){
                val currentUser = document.getString(KEY_USER)
                val currentMessage = document.getString(KEY_MESSAGE)
                val message = Message(currentUser, currentMessage)
                messageList.add(message)
            }
        }
        .addOnFailureListener {
            Log.d("FireStoreFetchError", "Exception", it)
            Toast.makeText(this, "Failed to fetch", Toast.LENGTH_SHORT).show()
        }
}

【问题讨论】:

  • 您是否检查过您的侦听器是否真的在addOnSuccessListener 中返回数据?也就是documents真的有数据吗?
  • 如何查看列表?
  • @AlexMamo 我检查了 Logs 和 Toasts 也从听众工作之外的任何地方添加
  • @MehranBehbahani 是的,我已经检查了一条 toast 消息以显示一个键值并且它正在工作
  • 所以你说在听众之外的任何地方都行不通,对吧?

标签: android list kotlin android-recyclerview google-cloud-firestore


【解决方案1】:

好的,所以我不知道该怎么做,因为我的动机是实时更新列表,我切换到我附加到集合的快照侦听器来自 onStart() 的引用,这就是现在被覆盖的函数的外观(如下),但问题仍然存在,为什么不能在 OnSuccessListener 中编辑可变列表但如果其他人遇到像我这样的问题,那么这将起作用

override fun onStart() {
    super.onStart()
    messageCollecion.orderBy(KEY_TIME, Query.Direction.ASCENDING).addSnapshotListener(this, EventListener { value, error ->
        if (error != null){
            Log.e("SnapshotListener Error","Exception", error)
            return@EventListener
        }
        else if (value != null){
            messageList.clear()
            for (document in value){
                val currentUser = document.getString(KEY_USER)
                val currentMessage = document.getString(KEY_MESSAGE)
                val message = Message(currentUser, currentMessage)
                messageList.add(message)
                chatBoxView.adapter?.notifyDataSetChanged()
                chatBoxView.scrollToPosition(chatBoxView.adapter!!.itemCount - 1)
            }
        }
    })
}

【讨论】:

    【解决方案2】:

    首先,检查你的messageList是否真的是MutableList

    第二,在每次更改 messageList 后,您必须通过以下方式通知适配器有关更改: messagesAdapter.notifyDataSetChanged()

    您可以查看通知适配器的更好方法,请查看此处:https://developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.Adapter#notifyDataSetChanged()

    【讨论】:

    • 我不认为问题是为什么recyclerview中没有显示数据。问题是没有将值添加到列表中。
    • 这是一个可变列表,因为使用 . add 方法我可以从文件的任何其他部分添加元素,并且已经使用离线声明的数据进行了测试,回收器视图也很好,在这种方法中,我只是在设置适配器之前从数据库中填充列表
    • 所以根据你之前的答案(监听器被调用并且列表是可变的,列表和视图之间的连接是好的)我可以假设你犯了一些错字,错误的列表分配或其他简单的错误。没有完整的代码很难确定。
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2016-06-02
    • 2020-05-14
    • 2018-08-29
    • 1970-01-01
    相关资源
    最近更新 更多