2014-09-03 3 views
1

У меня есть фильтр на моем CheckboxTreeViewer и перед применением фильтра на treeviewer я проверил элемент. Мой фильтр работает с текстовым полем и использует функцию ModifyListener во время записи.CheckboxTreeViewer снял флажки с моего выбора после вызова refresh()

text.addModifyListener(new ModifyListener() { 
    public void modifyText(ModifyEvent e) { 
     refreshFilter(); 
    } 
}); 

private void refreshFilter() { 
    myFilter.setFilter(text.getText()); 
    checkboxTreeViewer.refresh(); 
} 

Фильтр работает идеально, но после применения фильтра мои более старые выборы становятся неконтролируемыми. Может быть, ситуация примерно LabelProvider или ContentProvider.

Я пытался позвонить checkboxTreeViewer.refresh(false); не работал.

Кроме того, я обновил информацию о проблеме с коллапсом. Предложение реализует IElementComparer и переопределяет функции equals() и hashCode(), и, возможно, снять эту проблему можно с помощью этого способа.

Вот мой ContentProvider:

private class MyTreeContentProvider implements ITreeContentProvider { 

    @Override 
    public void dispose() { 

    } 

    @Override 
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 

    } 

    @Override 
    public Object[] getElements(Object inputElement) { 
     return ((List) inputElement).toArray(new Object[0]); 
    } 

    @Override 
    public Object[] getChildren(Object parentElement) { 
     if(parentElement instanceof FirstClass) { 
      FirstClass is = (FirstClass)parentElement; 
      return dbc.runJob(Util.byId(is.getId()).joinPrsl(true).joinIsltm(true)).getList().toArray(new SecondClass[0]); 
     } else 
      return new Object[0]; 
    } 

    @Override 
    public Object getParent(Object element) { 
     return null; 
    } 

    @Override 
    public boolean hasChildren(Object element) {    
     if(element instanceof SecondClass) 
      return false; 
     else 
      return true; 
    } 

} 

В заключение, я не могу решить мою проблему, и мне нужна ваша помогает.

+0

Я думаю, нам нужно увидеть код вашего контент-провайдера. –

+0

@ greg-449 Я добавил код поставщика контента – cgrgcn

ответ

1

Похоже, что ваш метод getChildren возвращает новые объекты для данного родительского элемента при каждом его вызове.

В этом случае equals метода нового объекта вы создаете должны возвращения true, когда он получает предыдущий объект, представляющий ту же величину. Метод hashCode должен также возвращать одно и то же значение хэш-функции.

Иногда может быть проблематично изменить эти методы. В этом случае вы можете создать класс IElementComparer, чтобы предоставить специальные методы для дерева equals и hashCode. Вызвать средство просмотра setComparer для установки компаратора для дерева.

+0

Как я должен реализовать эти методы и где? существуют методы 'equals' и' hashCode' в классе ContentProvider, а также 'IElementComparer' при установке Comparer для treeViewer. – cgrgcn

+0

Вы реализуете их в классах, которые вы возвращаете из 'getChildren' и' getElements' - из его внешнего вида 'SecondClass' - это тот, который вам нужно сделать. Добавлен что-то на IElementComparer для ответа. –