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, он просто вызывал мое пользовательское создание строки, поэтому оно добавлялось в таблицу вместо перерисовки строки, по которой щелкали.