微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RecyclerView 更新列表项的速度不够快

如何解决RecyclerView 更新列表项的速度不够快

我有一个应用程序与 meshNetwork 通信,并通过 wifi 不断接收具有 meshNodes 属性的消息。这些节点应该显示RecyclerView 中,并且当属性随着 LiveData 的使用而发生变化时也会更新。 但是,当我几乎同时收到多条消息时,RecyclerView 不会更新列表。 例如。收到来自 meshNode 的消息,如果该节点不在 LiveData<List<>> 内的列表中,它将被添加。将它添加到列表后,绑定的回收器视图显示节点,现在一切都很完美。在收到来自不在列表中的另一个 meshNode 的新消息并将其添加到列表后,meshNode 不会立即显示在 RecyclerView 中。

我真的不知道为什么,我们将不胜感激。

MeshNodeHandler 处理从 meshNetwork 接收到的消息,并更新节点列表

class MeshNodeHandler() : MeshHandler.MeshListener() {
    private val mMeshNodes= mutablelistof<MeshNode>()
    private val mMeshNodesLiveData = mutablelivedata<List<MeshNode>> = mutablelivedata()
    val meshNodes: LiveData<List<MeshNode>>= mMeshNodesLiveData

    override fun onNodeMessageReceived(nodeMessage: NodeMessage) {
        val node =
            mMeshNodes.firstOrNull {
                it.meshID == nodeMessage.meshID
            }

        if (node != null && checkIfNodePropertiesChanged(node,nodeMessage)) {
            Timber.d("Update mesh node")
            // Update node in List...
            mMeshNodesLiveData.postValue(mMeshNodes)
        } else if (node == null) {
            Timber.d("Add mesh node")
            // Add node to list
            mMeshNodesLiveData.postValue(mMeshNodes)
        }
    }
}

MeshNodesListviewmodel 只是从 NodeHandler 公开列表

class MeshNodesListviewmodel @Inject constructor(
    private val meshNodeHandler: MeshNodeHandler
) : viewmodel() {
    val meshNodes: LiveData<List<MeshNode>> =  meshNodeHandler.meshNodes
}

MeshNodesListFragment 观察 LiveData 并将列表提交给适配器

class MeshNodesListFragment : BaseFragment<FragmentMeshNodesListBinding,MeshNodesListviewmodel>(
    layoutId = R.layout.fragment_mesh_nodes_list
) {
    @Inject
    lateinit var viewAdapter: MeshNodesAdapter

    override fun onInitDataBinding() {
        // DataBinding stuff ...
        viewBinding.meshNodesRecyclerView.apply {
            adapter = viewAdaper
        }
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
        super.onViewCreated(view,savedInstanceState)

        viewmodel.meshNodes.observe(viewLifecycleOwner,{ 
            Timber.d("Submit list")
            viewAdapter.submitList(it)
        })
    }
}

Logcat:

D/MeshNodeHandler: Add mesh node
D/MeshNodesListFragment: Submit List
...
D/MeshNodehandler: Add mesh node
D/MeshNodesListFragment: Submit List

所以日志说LiveData<List<>>添加了第二个节点,列表也应该提交给Adaper,但是{{1}中没有显示第二个项目}.如果我销毁 RecyclerView 并通过切换到纵向模式再次创建它,那么这两个项目都会显示

感谢每一个回复,加油,保持健康!

解决方法

我认为您在更新列表后遗漏了 notifyDataSetChanged()。我的理解是列表已更新但未反映在视图中,因为 recyclerView 未更新其视图。尝试根据您是添加单个项目还是多个项目来调用 notifyItemInserted()notifyItemRangeInserted() 变体。希望这能解决问题。如果有帮助,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。