В настоящее время я перекодирую TableViewer для работы полностью виртуально. Пока я довольно доволен результатами, но у меня все еще есть проблема, что все видимые элементы в таблице обновляются с фиксированным таймером. Модель постоянно меняется, хотя. Это означает, что если я нажму на запись до того, как произойдет периодическое обновление, таблица загрузит фактическое значение для этой позиции, но оставит все остальные элементы без изменений. Поскольку именно так работает LazyContentProvider, установленный для TableViewer, это не является большой проблемой. Поскольку мой TableViewer является средством просмотра входящих событий в режиме реального времени, а новейшая запись сдвигает все остальные элементы на один, я хотел бы обновить все видимые элементы при добавлении нового события.
Я пытался использовать TableViewer.refresh () при добавлении нового элемента, но это, похоже, ничего не делает.
Поскольку полный код довольно сложный и является частьюбольший кусок кода Я приведу базовое представление кода:
public class MyClass{
public TableViewer liveViewer;
public List<String> myItems=new ArrayList<>();
void init(){
liveViewer = new TableViewer(liveComp, SWT.BORDER | SWT.FULL_SELECTION | SWT.VIRTUAL);
liveViewer.setContentProvider(new LiveViewerContentProvider(liveViewer));
liveViewer.setLabelProvider(someLabelProvider);
liveViewer.setUseHashlookup(true);
ClassThatProvidesItems.addListener(new ItemAddedListener(){
@Override
void itemAdded(String item){
myItems.add(0,item);
}
}
}
}
public class LiveViewerContentProvider implements ILazyContentProvider{
private TableViewer viewer;
private List<String> input;
public LiveViewerContentProvider(TableViewer viewer) {
this.viewer = viewer;
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.input = (List<String>) newInput;
}
@Override
public void updateElement(int index) {
viewer.replace(input.get(index), index);
}
}
Я знаю, что ArrayList, вероятно, не лучший выбор, для того, чтобы всегда добавлять элемент в заголовке, но, пожалуйста,игнорируйте это сейчас. Я пытался выполнить liveViewer.refresh ();в конце обратного вызова слушателя, но, похоже, он не обновил мои элементы. Что можно сделать, чтобы принудительно обновить все видимые элементы при добавлении нового?
Заранее спасибо.