2013-03-26 43 views
0

我使用一个单独的基础上,设置上CellList项目样式:如何阻止我的GWT CellList项目失去其CSS样式?

cellList.getRowElement(0).addClassName("style-name-A"); 
cellList.getRowElement(1).addClassName("style-name-B"); 

当我运行应用程序这反映。但是,当我点击任何行项目时,所有项目都将丢失这些样式并恢复为CellList的标准样式(如我的CellListResources css文件中所定义)。我怎样才能阻止这种行为?

我加入项目通过ListDataProvider的CellList;使用MultiSelectionModel的子类来处理选择,并将我自己的CellListResources传递给CellList构造函数来定义基础样式。

回答

0

这是因为选择重新呈现行,因此失去你会对此元素所做的任何更改。

,我发现这种情况的解决方法是在单个电池来处理它。

在实践中我换我的每一个细胞变成了“StyleAwareCellDecorator”,这与给定的风格围绕创建一个跨度。 然后,我根据某些逻辑决定应用哪种样式。它可以基于context.getIndex()在你的情况。

public class StyleAwareCellDecorator<C> extends AbtractCell<C> { 

    private final Cell<C> decorated; 
    private final MyLogic logic; 

    public StyleAwareCellDecorator(Cell<C> decorated, MyLogic logic) { 
     this.decorated = decorated; 
     this.logic = logic; 
    } 

    void render(Context context, C value, SafeHtmlBuilder sb) { 
     String theCssClass = myLogic.decideWhatStyleToUse(context.getIndex()); 
     sb.append(... some tag with class="theCssClass" ...); 
     delegated.render(context, value, sb); 
     sb.append(... close tag ...); 
    } 
} 

有了这个设施到位,你可以将其替换代码:

MyLogic myCellStyleLogic; 
myCellStyleLogic.useStyleForRowIndex("style-name-A", 0); 
myCellStyleLogic.useStyleForRowIndex("style-name-B", 1); 

而让说,该行存放在一个地图

+0

感谢。我首先试图在渲染之外控制这个,因为我不想让传递给我的渲染代码的数据知道状态。但是,正如你指出的那样...行(以及单元格)随意重新渲染。 – Carl 2013-04-30 14:00:40

+0

我正在使用UiBinder而不是StringBuilding HTML字符串,因此我要将我的数据对象中的新“标志”传递到UiBinder文件中,然后让该文件使用该标志来决定要设置的样式。 – Carl 2013-04-30 14:03:24