GWT CellList水平

时间:2010-12-07 08:51:48

标签: gwt uibinder

有人知道如何使CellList水平定向吗?如果可能,请使用UiBinder,但这不是必需的。

5 个答案:

答案 0 :(得分:2)

按照Thomas Broyer的建议on the google-web-toolkit groupHow to style GWT CellList?,我们可以将新的CSS资源注入到CellList构造函数中。

用于获取水平格式MyCellList.css的CSS:

/* This file is based on the CSS for a GWT CellList:
 * https://gwt.googlesource.com/gwt/+/master/./user/src/com/google/gwt/user/cellview/client/CellList.css
 * The primary purpose is to arrange for the <div> elements that contain each cell to be laid out inline (horizontally).
 */

/* Using inline-block, following Thomas Broyer's recommendations (with link to justification) here:
 * https://groups.google.com/forum/#!topic/google-web-toolkit/rPfCO5H91Rk
 */
.cellListEvenItem {
    display: inline-block;
    padding: 5px;
}

.cellListOddItem {
    display: inline-block;
    padding: 5px;
}

像这样定义一个新的资源:

public interface MyCellListResource extends CellList.Resources {
  public static MyCellListResource INSTANCE = GWT.create(MyCellListResource.class);
  interface MyCellListStyle extends CellList.Style {}

  @Override
  @Source({CellList.Style.DEFAULT_CSS, "MyCellList.css"})
  MyCellListStyle cellListStyle();
}

注入新样式,并将其传递给CellList的构造函数:

    MyCellListResource.INSTANCE.cellListStyle().ensureInjected();

    CellList<Fare> cellList = new CellList<Fare>(cell, MyCellListResource.INSTANCE);

请注意,新样式出现在CellList的DEFAULT样式之后的级联中,因此您只需将所需的修改放入MyCellList.css中。

答案 1 :(得分:1)

尝试覆盖CellList.renderRowValues方法。您必须能够创建水平演示模板。

答案 2 :(得分:1)

我不想重现这个方法有很多逻辑,但是我用hack替换所有div的hacky解决方案有效:

public class HorizontalCellList<T> extends CellList<T> {

  public HorizontalCellList(Cell<T> cell) {
    super(cell);
  }

  @Override
  protected void renderRowValues(
      SafeHtmlBuilder sb, List<T> values, int start, SelectionModel<? super T> selectionModel) {
    SafeHtmlBuilder filteredSB = new SafeHtmlBuilder();
    super.renderRowValues(filteredSB, values, start, selectionModel);
    SafeHtml safeHtml = filteredSB.toSafeHtml();
    String filtered = safeHtml.asString().replaceAll("<div", "<span").replaceAll("div>","span>");
    sb.append(SafeHtmlUtils.fromTrustedString(filtered));
  }
}

答案 3 :(得分:0)

使用CSS的变体 - 在单元格列表上设置CSS类名

CellList<T> list = new CellList<T>(...);
list.addStyleName('myList');

然后将CSS规则应用于单元格以使它们水平对齐:

.myList > div > div > div {
    display: inline;
}

答案 4 :(得分:0)

我能够通过扩展CellList并创建我自己的模板+覆盖renderRowValues方法来解决这个问题。简单地将div更改为跨度并不能解决这个问题,也许是因为我有自定义单元格(每个单元格都呈现为表格)。添加显示:CSS上的内联也不适用于我。

我的模板代码与原版完全相同,只是我添加了&#34; float:left;&#34;式:

    interface Template extends SafeHtmlTemplates {
    @Template("<div onclick=\"\" __idx=\"{0}\" style=\"float:left;\">{1}</div>")
    SafeHtml span(int idx, SafeHtml cellContents); ...

这是我的renderRowValue方法的片段:

    int length = values.size();
    int end = start + length;
    for (int i = start; i < end; i++) {
        SingleKeyValueModel value = values.get(i - start);

        //super.renderRowValues(sb, values, start, selectionModel);

        SafeHtmlBuilder cellBuilder = new SafeHtmlBuilder();
        Context context = new Context(i, 0, getValueKey(value));
        cell.render(context, value, cellBuilder);


        sb.append(TEMPLATE.span(i, cellBuilder.toSafeHtml()));

    }