Медленная перерисовка TableViewer при смене объекта ввода

В моем проекте у меня есть TableViewer, который отображает около 1 тыс. строк данных из базы данных. ContentProvider это ArrayContentProvider.

Когда я меняю ввод списка (setInput() на объект TableViewer) на другой с таким же объемом данных, все в порядке. Но когда я хочу обновить его с помощью List<T> с размером, отличным от предыдущего, приложение зависает примерно в 10 раз по сравнению с тем же объемом данных.

Первый список имеет размер 1k, а второй список размером около 960. Выполнение зависает прямо на методе setInput().

Кто-нибудь знает, почему это происходит?


person Zayl    schedule 17.10.2012    source источник
comment
TableViewer делает много вещей в методе setInput; получение элементов в виде массива, сортировка, фильтрация, сравнение со старыми элементами списка и т. д. Я бы, вероятно, сначала проверил метод toArray для любых реализаций списка, которые у вас есть, поскольку их будет легко сравнить/устранить.   -  person Nick Wilson    schedule 17.10.2012


Ответы (1)


Я думаю, причина в том, что когда вы устанавливаете список другого размера, все собственные элементы таблицы воссоздаются. Поэтому, чтобы ускорить вашу таблицу, вы должны использовать таблицу стилей SWT.Virtual. В виртуальной таблице создаются только отображаемые элементы таблицы. Остальные создаются при прокрутке.

См. http://git.eclipse.org/c/platform/eclipse.platform.ui.git/tree/examples/org.eclipse.jface.snippets/Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/Snippet029VirtualTableViewer.java в качестве примера.

person Ralf M Petter    schedule 06.11.2012
comment
Спасибо за повтор. К сожалению, я уже использую этот стиль в TableViewer, и это не помогло. Что интересно, при переходе на меньший размер таблица загружается корректно, но когда потом я хочу загрузить больший список, то он зависает. - person Zayl; 06.11.2012
comment
Вы должны использовать профайлер для анализа проблемы. Профилировщик покажет вам, что делает ваш код во время зависания. - person Ralf M Petter; 07.11.2012