我有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”的丢失?
答案 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类以访问类名,以便在整个应用程序中修改类名。