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

时间:2021-03-24 03:43:08

标签: android kotlin android-recyclerview adapter android-livedata

我有一个应用程序与 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 并通过切换到纵向模式再次创建它,那么这两个项目都会显示。

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

1 个答案:

答案 0 :(得分:0)

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