GWT CellList... при нажатии на элемент ранее выбранный элемент теряет свой стиль
У меня есть GWT CellList, и после добавления элементов через DataProvider я использую следующий код для добавления стилей к каждому элементу.
members... we can styling if a matched item is also in members
matched... passed in as a MetaJsArray<Contact>
CellList<Contact> list = getView().getResults();
for (int i=0; i<matched.length(); i++) {
if (members.isExistingEntry(matched.get(i))) {
list.getRowElement(i).addClassName("RED");
}
}
Этот код работает, пока... Я не нажимаю элементы в списке.
onCellPreview () вызывается для каждого нажатого элемента, но ранее выбранный элемент теряет свой "КРАСНЫЙ" стиль.
Нужно ли добавлять стили по-другому? Или как мне остановить потерю "КРАСНОГО"?
2 ответа
После попытки различных подходов единственное, что работает, без хаков, - это определить стиль в точке рендеринга.
С моим собственным ContactCell, расширяющим AbstractCell, функция render() может передать значение стиля в файл contactcell.ui.xml.
@Override
public void render(Context context, Contact value, SafeHtmlBuilder sb) {
if (value == null) {
return;
}
String styling = value.getStyling();
uiRenderer.render(sb, styling);
}
а затем в файле contactcell.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'>
<ui:with field='styling' type='java.lang.String'/>
<div class="{styling}"> ... </div>
GWT будет искажать имя стиля, поэтому определите свой собственный класс CssResource для доступа к имени класса, чтобы имя класса было искажено по всему приложению.
Я думаю, это то, что GWT генерирует JavaScript. Когда вы вручную устанавливаете ячейку на нагрузку, все хорошо. Когда вы выбираете его, javascript изменяет объект, чтобы использовать выбранный CSS, а когда вы его не выбираете, CSS меняет стиль CSS GWT по умолчанию для ячейки.
Единственный способ, которым я могу думать, - это иметь обработчик для выбора. Когда вы выбираете предмет:
selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
public void onSelectionChange(SelectionChangeEvent event) {
// get item last selected
// check if needs re styling
// restyle
// do things with the new selected object
}
});
Добавьте еще один чек в список ячеек и отметьте те, которые не отмечены. Этот способ может быть неэффективным, но это единственный способ избежать вашей проблемы, о которой я могу думать. Надеюсь, поможет.