在日食RCP应用程序中,我有一个带有VIRTUAL样式的tableviewer,用于绘制大量数据。
我正在使用实现IStructuredContentProvider&的自定义内容提供商。自定义表查看器,将ITableLabelProvider实现为表查看器的一部分..
我需要通过所有列对表数据进行排序。
排序适用于所有列。但是,我在表上有一个选择事件,并且有一些基于表选择的操作。
让我们说以下项目按顺序显示在视图上
单击特定列后,视图按以下顺序排序
但是,在选择E(表格的第1项)时,会加载项目A的详细信息,而不是项目E的详细信息。
看起来模型没有使用排序数据更新,因此不匹配。似乎只在UI上进行排序,并且模型没有相应更新。
你可以帮帮我吗?
我不希望编写自定义比较器并编写与标签提供程序的getColumnText中的一部分相同的逻辑,以对各列进行排序并使用该比较器对模型进行排序。
注意:如果我取出VIRTUAL样式并检查所选项目,它的效果非常好。所选项目的详细信息按预期加载。
PFB,用于在我的应用程序中进行排序的代码片段。
TableColumnSorter cSorter = new TableColumnSorter(tabViewer, column.getColumn()) {
protected int doCompare(Viewer v, Object e1, Object e2) {
ITableLabelProvider lp = ((ITableLabelProvider) tabViewer
.getLabelProvider());
String t1 = lp.getColumnText(e1, colIdx);
String t2 = lp.getColumnText(e2, colIdx);
return t1.compareTo(t2);
}
};
cSorter.setSorter(cSorter, TableColumnSorter.ASC);
自定义TableColumnSorter类如下
abstract class TableColumnSorter extends ViewerComparator {
public static final int ASC = 1;
public static final int NONE = 0;
public static final int DESC = -1;
private int direction = 0;
private TableColumn column;
private TableViewer viewer;
public TableColumnSorter(TableViewer viewer, TableColumn column) {
this.column = column;
this.viewer = viewer;
this.column.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (TableColumnSorter.this.viewer.getComparator() != null) {
if (TableColumnSorter.this.viewer.getComparator() == TableColumnSorter.this) {
int tdirection = TableColumnSorter.this.direction;
if (tdirection == ASC) {
setSorter(TableColumnSorter.this, DESC);
} else if (tdirection == DESC) {
setSorter(TableColumnSorter.this, ASC);
}
} else {
setSorter(TableColumnSorter.this, ASC);
}
} else {
setSorter(TableColumnSorter.this, ASC);
}
}
});
}
public void setSorter(TableColumnSorter sorter, int direction) {
if (direction == NONE) {
column.getParent().setSortColumn(null);
column.getParent().setSortDirection(SWT.NONE);
viewer.setComparator(null);
} else {
column.getParent().setSortColumn(column);
sorter.direction = direction;
if (direction == ASC) {
column.getParent().setSortDirection(SWT.DOWN);
} else {
column.getParent().setSortDirection(SWT.UP);
}
if (viewer.getComparator() == sorter) {
viewer.refresh();
} else {
viewer.setComparator(sorter);
}
}
}
public int compare(Viewer viewer, Object e1, Object e2) {
return direction * doCompare(viewer, e1, e2);
}
protected abstract int doCompare(Viewer TableViewer, Object e1, Object e2);
}
答案 0 :(得分:3)
来自TableViewer
TableViewer现在支持SWT.VIRTUAL标志。如果是基础表 是SWT.VIRTUAL,内容提供商可以实现 ILazyContentProvider而不是IStructuredContentProvider。 请注意 在这种情况下,查看器不支持排序或过滤。