GWT CellTable 列排序

Posted

技术标签:

【中文标题】GWT CellTable 列排序【英文标题】:GWT CellTable columnsorting 【发布时间】:2012-02-21 15:28:10 【问题描述】:

我正在尝试使用他们的 ListDataProvider 排序示例作为参考对 GWT 中的列进行排序

http://code.google.com/webtoolkit/doc/latest/DevGuideUiCellTable.html#columnSorting

问题是我可以看到我的表格列数据正在排序(通过使用调试器),但表格永远不会刷新。查看上面链接中的示例,他们没有明确刷新显示。我在这里遗漏了什么吗?

谢谢。

【问题讨论】:

【参考方案1】:

我的经验是排序处理程序(即 ListHandler)在您创建 ListDataProvider 时对 List 很敏感。

所以我建议不要为 ListDataProvider 删除或设置新列表(当然我认为在创建时它应该至少有一个空(非空)列表)。

只需使用 ListDataProvider.getList() 并在上面做你的工作。

例如要删除所有当前行并设置新数据,只需调用ListDataProvider.getList().clear(),然后调用ListDataProvider.getList().addAll(yourNewData); 不要打电话给setList(),否则排序会失效。

【讨论】:

Hamzeh,你是个摇滚明星!你不知道我为此寻找解决方案已经有多久了。使用 getList().addAll() 而不是 setList() 对我有用。【参考方案2】:

这两个例子无用且令人困惑。

在说明如何使用单元格/网格表时,使用 ListHandlers 和 DataProviders 也没有太大帮助。

这些示例混淆并隐藏了 GWT 单元格/网格表的一个简单特征 - 您只需要在每次数据发生变化时替换列表并将其输入到表中。

这些示例对 ListHandlers、Async 处理程序和 DataProviders 的使用使一个相当简单的过程复杂化,因为它们加入了一大堆蓬松无用的抽象优雅。本质上,这些抽象和可怕的结构本身会将记录推送和重新推送到表列表中。不要注意定时器的使用。

还不如通过它的喇叭来获取表格列表并自己做 - 那样简单得多。我不记得我是怎么做的,因为我没有我的代码。

您需要做的是保留记录列表的缓冲区副本。这是要在表格中显示的记录列表。

无论您是执行异步还是其他方式都无关紧要 - 您希望对数据进行的任何更改都将在该缓冲区副本上进行。您的 GWT-RPC 应该更新该缓冲区。

当表格请求升序排序时,您的比较器/过滤器将生成缓冲列表的升序副本,以使用 setRowData 替换表格中的数据。同样,当表请求降序或专门过滤时。

如果您希望让它为您管理分页,则使用 DataProvider 很有用。自己处理 GWT-RPC 要简单得多。 DataProvider 应该通过请求服务器向它发送一个根据表的意愿排序/过滤的新列表来为您处理排序和过滤。你为什么要让服务器管理你的过滤/排序来消耗网络流量,除非你有超过 10 页的记录。

所以对于一个简单的 50 条记录实验示例,请自行管理缓冲区列表。

【讨论】:

感谢您的回复,我完全同意您的观点,插图不是很有帮助,如此真实......但完全按照您所说的去做,并且实际上得到了它的工作。再次感谢。 一些对单元格/网格表工作不多的人投票反对我。 如果您的数据是 > ≈10K 元素(取决于元素),则异步很重要,否则您可能会减慢界面速度。我有两个数据网格表。

以上是关于GWT CellTable 列排序的主要内容,如果未能解决你的问题,请参考以下文章

带有标签和图像的 GWT Celltable 列

GWT CellTable 选择并单击 CheckBoxCell

GWT CellTable,单击时禁用 ButtonCell

GWT 2.5.1 CellTable 和 SimplePager 问题

GWT RequestFactory + CellTable

CellTable 的 GWT RPC 匹配数据