GWT CellList ...当项目被点击时,之前点击的项目将失去其样式

时间:2013-04-30 09:15:45

标签: css 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(),但之前单击的项目将失去其“RED”样式。

我是否需要以不同方式添加样式?或者我如何阻止“RED”的丢失?

2 个答案:

答案 0 :(得分: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
                }
              });

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

答案 1 :(得分:0)

在尝试各种方法后,唯一想要的就是在没有黑客的情况下工作,就是在渲染时定义样式。

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