0

我有 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() 为每个单击的项目调用,但先前单击的项目失去其“红色”样式。

我需要以不同的方式添加样式吗?或者我该如何止损“RED”?

4

2 回答 2

0

在尝试了各种方法之后,唯一有效的方法是在渲染点定义样式,而无需 hack。

使用我自己的 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 类以通过访问类名,以便在整个应用程序中修改类名。

于 2013-05-01T15:42:42.103 回答
0

我猜它与 GWT 生成 javascript 的方式有关。当您在加载时手动设置单元格时,一切都很好。当您选择它时,javascript 会更改对象以使用选定的 CSS,当您取消选择它时,CSS 将更改为单元格的默认 GWT CSS 样式。

我能想到的唯一方法是在选择上有一个处理程序。当您选择一个项目时:

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

通过单元格列表添加另一个检查并标记未标记的那些。这种方式可能效率低下,但它是我能想到的避免您的问题的一种方式。希望能帮助到你。

于 2013-04-30T15:55:38.110 回答