CellTable Проблемы с пользовательскими строками и ListDataProvider GWT

По сути, я пытаюсь создать CellTable с несколькими разделами, разделенными пользовательской строкой, охватывающей все столбцы для разграничения разделов. До сих пор я использую ListDataProvider для данных таблицы, и я расширяю AbstractCellTableProvider и переопределяю buildRowImpl, чтобы определить, когда нужно добавить пользовательскую строку. Это несколько работает, но не все строки отображаются, и по какой-то странной причине, когда я щелкаю, чтобы выбрать одну из строк в CellTable, он случайным образом добавляет дубликаты строк в CellTable. Я не уверен, происходит ли что-то странное с SelectionModel, который я использую, но если кто-то сможет помочь с этим, это будет оценено.

Вот класс, который я создал, который расширяет AbstractCellTableBuilder. Строитель строк по умолчанию просто копируется из того, что обычно делает buildRowImpl. Если ListDataProvider rowValue соответствует определенным критериям с использованием оператора if, то он отправляется в мой buildExtraRow, где создается отдельная строка ячейки.

    public class CustomCellTableBuilder extends AbstractCellTableBuilder<SearchColumn>{
    public CustomCellTableBuilder() {

        super(cellTable_2);
        System.out.println("Getting into CustomCellTableBuilder super");
    }

    @Override
    protected void buildRowImpl(SearchColumn rowValue, int absRowIndex){
       //building main rows logic
        System.out.println("Getting into custom buildRowImpl, labelrow = " + labelrow);

        if (rowValue.quantity.equals("test")){
            System.out.println("Going to build extra row if");
            buildExtraRow(absRowIndex, rowValue);
        }
        else {
            System.out.println("rowValue: " + rowValue);
             final String evenRowStyle;
               final String oddRowStyle;
               final String selectedRowStyle;
               final String cellStyle;
               final String evenCellStyle;
               final String oddCellStyle;
               final String firstColumnStyle;
               final String lastColumnStyle;
               final String selectedCellStyle;

               Style style = cellTable_2.getResources().style();
                evenRowStyle = style.evenRow();
                oddRowStyle = style.oddRow();
                selectedRowStyle = " " + style.selectedRow();
                cellStyle = style.cell();
                evenCellStyle = " " + style.evenRowCell();
                oddCellStyle = " " + style.oddRowCell();
                firstColumnStyle = " " + style.firstColumn();
                lastColumnStyle = " " + style.lastColumn();
                selectedCellStyle = " " + style.selectedRowCell();

            // Calculate the row styles.
            SelectionModel<? super SearchColumn> selectionModel = cellTable_2.getSelectionModel();
            boolean isSelected =
                (selectionModel == null || rowValue == null) ? false : selectionModel.isSelected(rowValue);
            boolean isEven = absRowIndex % 2 == 0;
            StringBuilder trClasses = new StringBuilder(isEven ? evenRowStyle : oddRowStyle);
            if (isSelected) {
              trClasses.append(selectedRowStyle);
            }

            // Add custom row styles.
            RowStyles<SearchColumn> rowStyles = cellTable_2.getRowStyles();
            if (rowStyles != null) {
              String extraRowStyles = rowStyles.getStyleNames(rowValue, absRowIndex);
              if (extraRowStyles != null) {
                trClasses.append(" ").append(extraRowStyles);
              }
            }

            // Build the row.
            TableRowBuilder tr = startRow();
            tr.className(trClasses.toString());

            // Build the columns.
            int columnCount = cellTable_2.getColumnCount();
            System.out.println("column count " + columnCount);
            for (int curColumn = 0; curColumn < columnCount; curColumn++) {
              Column<SearchColumn, ?> column = cellTable_2.getColumn(curColumn);
              // Create the cell styles.
              StringBuilder tdClasses = new StringBuilder(cellStyle);
              tdClasses.append(isEven ? evenCellStyle : oddCellStyle);
              if (curColumn == 0) {
                tdClasses.append(firstColumnStyle);
              }
              if (isSelected) {
                tdClasses.append(selectedCellStyle);
              }
              // The first and last column could be the same column.
              if (curColumn == columnCount - 1) {
                tdClasses.append(lastColumnStyle);
              }

              // Add class names specific to the cell.
              Cell.Context context = new Cell.Context(absRowIndex, curColumn, cellTable_2.getValueKey(rowValue));
              String cellStyles = column.getCellStyleNames(context, rowValue);
              if (cellStyles != null) {
                tdClasses.append(" " + cellStyles);
              }

              // Build the cell.
              HorizontalAlignmentConstant hAlign = column.getHorizontalAlignment();
              VerticalAlignmentConstant vAlign = column.getVerticalAlignment();
              TableCellBuilder td = tr.startTD();
              td.className(tdClasses.toString());
              if (hAlign != null) {
                td.align(hAlign.getTextAlignString());
              }
              if (vAlign != null) {
                td.vAlign(vAlign.getVerticalAlignString());
              }
              // Add the inner div.
              DivBuilder div = td.startDiv();
              div.style().outlineStyle(OutlineStyle.NONE).endStyle();

              // Render the cell into the div.
              renderCell(div, context, column, rowValue);

              // End the cell.
              div.endDiv();
              td.endTD();
            }

            // End the row.
            tr.endTR();
        }
    }

    private void buildExtraRow(int absRowIndex, SearchColumn rowValue){
        System.out.println("In buildExtraRow");
        start(true);
        TableRowBuilder row = startRow();
        TableCellBuilder td = row.startTD().colSpan(getColumns().size());
        td.text(label).endTD();
        row.endTR();

        //cellTable_2.redrawRow(absRowIndex);
    }}

И вот как я бы добавил строку в таблицу:

searchProvider.getList().add(new SearchColumn("test","","","","","","","",""));

Что-то еще, что меня смущает, связано с тем, как ListDataProvider работает с CellTable. Я не могу понять, когда именно CellTable обновляется на основе того, что находится в ListDataProvider, и как строки добавляются в CellTable на основе того, что находится в ListDataProvider.

1 ответ

Я выяснил, в чем проблема, если у кого-то возникнут проблемы в будущем. Когда вы щелкаете строку, она перерисовывает строку в соответствии с выбранной моделью. Таким образом, он перерисовывал строку, но поскольку я переопределил buildRowImpl, он просто вызывал мое пользовательское создание строки, поэтому оно добавлялось в таблицу вместо перерисовки строки, по которой щелкали.

Другие вопросы по тегам