当TreeViewer的输入模型发生变化,也就是setInput(Object object)方法的参数,需要使用refresh()刷新TreeViewer,刷新后TreeViewer会折叠所有的节点,怎么恢复之前的展开状态呢?
注意,TreeViewer每一个节点是Catalog类型,自己定义的类。
Object[] expandElements = (Object[]) treeViewer.getExpandedElements();// 获取刷新之前展开的元素
treeViewer.refresh();
注意,要在刷新之前获取展开的元素,因为刷新之后默认折叠所有节点。这时不能直接调用treeViewer.setExpandedState(Object, boolean)方法,因为输入模型已经发生变化,恢复展开状态是要展开新的节点,而expandElements存储的是旧的节点,所以要先获取新的节点。
List<Catalog> expandParentCatalogs = new ArrayList<Catalog>();
for (Object expandElement : expandElements) {
if (expandElement instanceof Catalog) {// 获取刷新之前展开的父目录
expandParentCatalogs.add((Catalog) expandElement);
}
}
for (Catalog parentCatalog : parentCatalogs) {// 恢复刷新之前展开的