如何在没有持久索引损坏/重复的情况下使用 beginMoveRows 进行排序?

Posted

技术标签:

【中文标题】如何在没有持久索引损坏/重复的情况下使用 beginMoveRows 进行排序?【英文标题】:How to sort with beginMoveRows without persistent index corruption / duplication? 【发布时间】:2013-07-30 11:00:37 【问题描述】:

我正在尝试使用 beginMoveRows / endMoveRows 使持久性索引保持不变,但有时扩展的状态标志/持久性索引会重复,它们不应该存在。

代码相当多,所以我将通过我认为我告诉机器要做的事情:

有一种方法 sortChildrenOf(item) 可以发挥所有作用。

从 item 中查找子项并调用 sortChildrenOf 并将每个子项作为 参数 保存旧订单 快速排序孩子 找出旧顺序和新顺序的差异 对于每个差异: beingMoveRows 应用更改 endMoveRows

当有 2 个级别时,一切都运行良好,但是当我输入“长”数据树时,持久索引会损坏。

树中的数据是从网络更新的,但实际更新是在gui线程中完成的。

我应该按什么确切的顺序来做事吗?我可能忘记继承导致这种情况的某些方法吗?

我已经实现了这些方法: - 数据 - 标志 - 获取项目 - 指数 - 父母 - 设置数据

编辑: 忘了提,我在主要的 sortChildrenOf 调用之前和之后得到了 emit layoutAboutToBeChanged 和 emit layoutChanged。

【问题讨论】:

我可能会走得更远,但是您是否在排序后发出 layoutChanged() 信号?我通常只做 layoutAboutToBeChanged() -> sort -> layoutChanged() 甚至不需要 beginMoveRows() 和 endMoveRows()。 是的,我正在这样做。我没有想到它可以在没有 begin 和 endmove 方法调用的情况下工作。我会尝试删除它们,看看会发生什么。您的排序是否对子数据进行了递归处理? 删除 beginMoveRows 和 endMoveRows 完全删除了持久索引。这导致选择不粘在数据上,它粘在位置上。如果用户选择“节点 10”,我希望它坚持“节点 10”。 【参考方案1】:

我让它工作,但不是使用 beginMoveRows 和 endMoveRows。我使用发出 layoutAboutToChange 的旧系统获取持久索引列表来操作它并使用 changePersistentIndexList 将其设置回来,最后发出布局更改。

由于这是修复程序,因此我相信 beginMoveRows、endMoveRows 和具有树类型数据的持久索引存在一些错误。

询问您是否需要更好的代码示例。

【讨论】:

以上是关于如何在没有持久索引损坏/重复的情况下使用 beginMoveRows 进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript:多个持久索引变量

R:如何在不使用循环的情况下按唯一向量顺序查找所有重复向量值的索引?

如何在没有分组的情况下连接熊猫中数据框一列的所有行[重复]

如何在不模拟多部分表单的情况下发布图像[重复]

使用 Git 时如何解决“错误:错误索引 – 致命:索引文件损坏”

NodeJS 如何在没有 WebSockets 的情况下处理持久连接?