Обновление записей виртуального TableViewer при смене модели - PullRequest
0 голосов
/ 30 октября 2019

В настоящее время я перекодирую 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 ();в конце обратного вызова слушателя, но, похоже, он не обновил мои элементы. Что можно сделать, чтобы принудительно обновить все видимые элементы при добавлении нового?

Заранее спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

Я только что заметил, что мое решение почти работает. Проблема заключалась в том, что весь код находился где-то внутри странного блока try-catch, который просто молча поглощал исключения и не давал мне исключение invalid-Thread-access, которое я должен был получить, чтобы не выполнять liveViewer.refresh в пределахДисплей-Тема. Обтекание строки, как это решило проблему:

Display.getDefault().asyncExec(new Runnable() {
                    @Override
                    public void run() {
                        liveViewer.refresh();
                    }
                });
...