Как удалить метки "нет данных" с пустых узлов в GWT?

У меня есть виджет, который наследует от CellTree, Если узел не имеет дочерних элементов, этот узел можно открыть и показать "no data" этикетка.

Я бы хотел, чтобы узлы без дочерних элементов отображались как пустые.

Вот так я заполняю дерево. мой DictionaryTreeDataProvider класс (соответствующая часть):

public class DictionaryTreeDataProvider extends ListDataProvider<MValue> {
    private final DictionariesServiceAsync service = GWT.create(DictionariesService.class);

    ...    

    @Override
    public void onRangeChanged(HasData<MValue> result) {
        service.queryDictionaryValues(range, query, new AsyncCallback<SubsetResult<MValue>>() {
            @Override
            public void onFailure(Throwable t) {
            }

            @Override
            public void onSuccess(SubsetResult<MValue> result) {
                getList().clear();
                for (MValue value : result.items) {
                    getList().add(value);
                }
            }
        });
    }
}

На стороне сервера я делаю EJB-вызов, который заполняет SubsetResult, Я обнаружил, что эта проблема исправлена ​​в версии GWT-2.5.0-rc2 (см. https://groups.google.com/forum/).


Теперь все в порядке, спасибо @moutellou. Я сделал, как он предложил:

...
@Override
public void onSuccess(SubsetResult<MValue> result) {
    if (result.length == 0) {
        updateRowCount(-1, true);
        return;
    } else {
        for (MValue value : result.items) {
            // some checks here
            getList().add(value);
        }
    }
}
...

3 ответа

Решение

Вот как я удалил метку без данных в моем DataProvider

 //Fetch children
  int size = children.size();
  if (size == 0) {
     updateRowCount(-1, true); //Method called on AsyncDataProvider 
     return;
  }  

В TreeViewModelубедитесь, что isLeaf метод возвращает true если значение аргумента не имеет дочерних элементов. Пример:

@Override
public boolean isLeaf(Object value) {
    if (value instanceof DepartmentDto) {
        DepartmentDto department = (DepartmentDto) value;
        return department.getEmployees().isEmpty();
    } else if (value instanceof EmployeeDto) {
        return true;
    } else {
        return false;
    }
}

В этом случае отдел должен объявить себя листом только в том случае, если у него нет сотрудников, сотрудник объявит себя листом и значение по умолчанию - false.

Обратите внимание, что значение многие также является внутренним узлом GWT. В этом примере это не обязательно DepartmentDto а также EmployeeDto,

Некоторое альтернативное решение. Может быть определен интерфейс, расширяющий интерфейс CellTree.Resources, В этом интерфейсе необходимо указать путь к CSS, который переопределяет нужный стиль.

Интерфейс CellTree.Resources:

public class CellTree extends AbstractCellTree implements HasAnimation,
    Focusable {
   ...  
  /**
   * A ClientBundle that provides images for this widget.
   */
  public interface Resources extends ClientBundle {

    /**
     * An image indicating a closed branch.
     */
    @ImageOptions(flipRtl = true)
    @Source("cellTreeClosedArrow.png")
    ImageResource cellTreeClosedItem();

    /**
     * An image indicating that a node is loading.
     */
    @ImageOptions(flipRtl = true)
    ImageResource cellTreeLoading();

    /**
     * An image indicating an open branch.
     */
    @ImageOptions(flipRtl = true)
    @Source("cellTreeOpenArrow.png")
    ImageResource cellTreeOpenItem();

    /**
     * The background used for selected items.
     */
    @ImageOptions(repeatStyle = RepeatStyle.Horizontal, flipRtl = true)
    ImageResource cellTreeSelectedBackground();

    /**
     * The styles used in this widget.
     */
    @Source(Style.DEFAULT_CSS)
    Style cellTreeStyle();
  } 
...
}

Интерфейс CustomCellTreeResourcesна основе CellTree.Resources:

import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.user.cellview.client.CellTree;

public interface CustomCellTreeResources extends CellTree.Resources {
    static final String STYLE_PATH = "components/common/client/static/custom-cell-tree.css";

    @Override
    @ClientBundle.Source({CellTree.Style.DEFAULT_CSS, STYLE_PATH})
    CellTree.Style cellTreeStyle();
}

Главное правило:

.cellTreeEmptyMessage {
    display: none;
}

Создайте экземпляр:

private final static CellTree.Resources customCellTreeResources = 
    GWT.create(CustomCellTreeResources.class);

А дальше надо явно пройти customCellTreeResources к CellTree конструктор класса.

Сообщение не отображается больше.

Обязательно: перед заполнением списка, т. Е. Перед нажатием на узел, список следует очистить (getList().clear();):

@Override
public void onRangeChanged(HasData<MValue> result) {
    service.queryDictionaryValues(range, query, 
          new AsyncCallback<SubsetResult<MValue>>() {
        @Override
        public void onFailure(Throwable t) {}
        @Override
        public void onSuccess(SubsetResult<MValue> result) {
            getList().clear();
            for (MValue value : result.items) {
                getList().add(value);
            }
        }
    });
}
Другие вопросы по тегам