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
                }
              });

Добавьте еще один чек в список ячеек и отметьте те, которые не отмечены. Этот способ может быть неэффективным, но это единственный способ избежать вашей проблемы, о которой я могу думать. Надеюсь, поможет.

Другие вопросы по тегам