TreeViewer для GridTreeViewer: мост между существующими ITreeContentProviders и "ленивым" ObservableListTreeContentProvider
TL;DR
Основываясь на статье Томаса Шиндля JFace-Viewer и Eclipse Databinding с> 10.000 объектов (что предлагает очень хорошую идею), я хотел бы преобразовать обычную TreeViewer
+ несколько ITreeContentProvider
реализации туманности GridTreeViewer
который использует ObservableListTreeContentProvider
, VisibleRangeChangedListener
и Eclipse Data Binding, чтобы сделать его "ленивым" (более ленивым) и загружать данные по требованию.
Как я должен переписать свой существующий регулярный ITreeContentProvider
реализации использовать одни и те же иерархии с ObservableListTreeContentProvider
? Могу ли я сделать "мост" между старым и новым решением? С помощью DelegatingListProperty
как то так? Есть другие идеи?
Я нашел несколько слишком простых примеров, но на самом деле я не понимаю концепции использования привязки данных в таком сложном иерархическом формате дерева.
Примеры деревьев и контент-провайдеров:
Контент провайдер 1.:
|- A1
|-- B1
|-- MyMessage1
|- A2
|-- B2
|-- MyMessage2
Контент провайдер 2.:
|- C1
|-- D1
|-- MyMessage1
|- C2
|-- D2
|-- MyMessage2
Более длинное объяснение
У меня есть представление, где я отображаю огромное количество объектов в иерархическом древовидном формате с использованием пользовательских TreeViewer
с классическим ITreeContentProvider
а также LabelProvider
+ ITableLabelProvider
Реализации. Существует также меню, в котором пользователь может выбрать, в каком формате он хочет видеть эту иерархию. Когда пользователь выбирает другой формат отображения, единственное, что происходит, это то, что другой ITreeContentProvider
реализация устанавливается для зрителя, и я обновляю его программно.
Это работает, но из-за огромного количества элементов (в некоторых случаях 100-200 тыс. Строк, пожалуйста, не спрашивайте причины, это просто должно работать), отображение элементов может быть медленным, пользовательский интерфейс иногда зависает, потому что там слушателей TreeItems очень много, обновление представления занимает много времени и т. д.
Поэтому я хотел бы использовать какое-то ленивое решение, когда элементы модели уже загружены в память.
Я уже пробовала SWT.VIRTUAL
а также ILazyTreeContentProvider
, но он работал плохо (даже если использовать viewer.setUseHashlookup(true)
) и был проблематичным (при прокрутке TreeItems загружалось много времени, были ошибки, проблемы с сортировкой, фильтрацией и т. д.).
Сейчас я читаю статью в блоге Томаса Шиндля: JFace-Viewer и Eclipse Databinding с> 10.000 объектов. Я хотел бы попробовать это с помощью Eclipse Nebula Grid GridTreeViewer
и + ObservableListTreeContentProvider
(который также является ITreeContentProvider
реализация) и VisibleRangeChangedListener
и "ленивый" провайдер этикеток (как в статье). Могу ли я как-то использовать свой существующий ITreeContentProvider
реализации и создать "мост" между этим и новым ObservableListTreeContentProvider
?
Кстати, я проверил Nebula NatTable, но мне ОЧЕНЬ было трудно перенести существующих поставщиков контента на это новое решение, его API и его подход полностью отличаются (иерархия идет от дочернего к родительскому, а не наоборот), и документация, связанная с Деревья до сих пор пусты.
1 ответ
Туманность сделала Грид виртуальной некоторое время назад. Вот фрагменты для зрителя, которые содержат несколько примеров для ленивого поставщика контента.