首页 > 解决方案 > 不断调用 recylerview notifyDataSetChanged 块 UI

问题描述

我正在开发聊天应用程序。我正在使用这个SoketLib库进行套接字发送和接收。现在,在发送消息后,我必须更新聊天列表。现在消息发送/接收频率/速度太高了。就像用户连续打字一样。所以这些列表操作会使整个屏幕在一段时间后变得很慢。我已经详细调试了我的套接字代码。所以这不是套接字问题。它只是不断调用recylerview的notifyDataSetChanged()方法。

  messagesAdapter?.notifyDataSetChanged()
      if (messagesAdapter != null)
            rvMessages?.scrollToPosition(messagesAdapter?.itemCount?.minus(1)!!)

为此,我也使用了 DiffUtil 但它也重现了相同的行为

 fun notifyChanges(oldList: List<AllMessages>, newList: List<AllMessages>) {

        val diff = DiffUtil.calculateDiff(object : DiffUtil.Callback() {
            override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
                return oldList[oldItemPosition].getChatId() == newList[newItemPosition].getChatId()
            }

            override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
                return oldList[oldItemPosition] == newList[newItemPosition]
            }

            override fun getOldListSize() = oldList.size
            override fun getNewListSize() = newList.size
        })

        rvMessages?.recycledViewPool?.clear()

        messagesAdapter?.let { diff.dispatchUpdatesTo(it) }
        // moveToBottom(2)

    }

任何帮助,将不胜感激。

标签: kotlinandroid-recyclerview

解决方案


推荐阅读