Как удалить метки "нет данных" с пустых узлов в 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);
}
}
});
}