【问题标题】:Unable to update mutableList object model values KotlinKotlin 无法更新 mutableList 对象模型值
【发布时间】:2021-02-04 15:42:17
【问题描述】:

所有人都想更新可变列表中的值,但是这里跳出的循环是我的代码 sn-p。

for ((i, dataObject) in data.withIndex()) {
            channelsObject.getChannel(
                dataObject.remoteChannelId,
                ChatCallbackListener<Channel>() {
                    Log.e("last friend", it.friendlyName)
                    it!!.messages?.getLastMessages(1, ChatCallbackListener<List<Message>>() {

                        if (it.size > 0)
                            if (it.get(0).hasMedia()) {
                                dataObject.isAttachement = true
                                dataObject.lastMessage = "attachment"
                            } else {
                                dataObject.lastMessage = it.get(0).messageBody
                                dataObject.lastMessageDataAndTime = it.get(0).dateCreated
                    })

                })

            setThreadAdapter(data)
    }

我无法更新数据类的两个值,看起来循环在获取消息之前跳出,非常感谢任何帮助。

谢谢

【问题讨论】:

  • 回调是在未来某个时间收到结果时运行的代码。循环不会提前退出,但在循环完成之前不会调用回调。
  • 那么解决办法是什么?
  • 我不知道你在说什么。我假设你的对象最终会被修改,但我不知道你正在使用什么 API。您可以创建一个计数器,每个侦听器都会递增,当它达到集合大小时,您会对现在完全修改的集合做出反应。或者您可以创建一个帮助程序,将 API 代码转换为挂起函数并在协程中使用它。这将产生最干净的代码。
  • 我正在使用 twilio 可编程聊天回调来接收每个频道的最后一条消息
  • 在 ChatCallbackListener 中调用 setThreadAdapter(data)

标签: android kotlin mutablelivedata


【解决方案1】:

看起来您的适配器在回调检索到的数据之前被调用。

有多种方法可以做到这一点。 但是下面有一个:

fun jhaman() {

val data = mutableListOf<Any>()
// to set the adapter with empty message so you can update
setThreadAdapter(data)

val remoteChannelId = 0// todo change this

data.forEachIndexed { index, any ->

channelsObject.getChannel(
            any.remoteChannelId,
            ChatCallbackListener<Channel>() { channel -> 
                Log.e("last friend", any.friendlyName)
                channel.messages?.getLastMessages(1, ChatCallbackListener<List<Message>>() {
                    //update your data what you wana to do in the data object
                    any.apply {
                        // update the data
                    }
                    adapter.updateThreadAdapter(index, any)
                })
            })
}

}

//在适配器中

fun updateThreadAdapter(index: Int, any: Any) {
    list.get(index) = any 
    notifyItemChanged(list)
}

将任何更改为您的对象。

免责声明:我没有运行此代码,因为我的项目中没有该聊天 API。谢谢

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多