Я использую виджет GWT CellList для рендеринга элементов Cell.
Есть ли способ зарегистрировать завершение рендеринга или выполнить выполненное событие для выполнения работы после выполнения рендеринга?
У меня был тот же вопрос, и я просмотрел код, который нашел возможное решение.
В HasDataPresenter
есть код, который отображает ячейки в представление (метод resolvePendingState(JsArrayInteger modifiedRows)
:
if (redrawRequired) {
// Redraw the entire content.
SafeHtmlBuilder sb = new SafeHtmlBuilder();
view.replaceAllChildren(newState.rowData, selectionModel, newState.keyboardStealFocus);
view.resetFocus();
} else if (range0 != null) {
// Surgically replace specific rows.
// Replace range0.
{
int absStart = range0.getStart();
int relStart = absStart - pageStart;
SafeHtmlBuilder sb = new SafeHtmlBuilder();
List<T> replaceValues = newState.rowData.subList(relStart, relStart + range0.getLength());
view.replaceChildren(replaceValues, relStart, selectionModel, newState.keyboardStealFocus);
}
// Replace range1 if it exists.
if (range1 != null) {
int absStart = range1.getStart();
int relStart = absStart - pageStart;
SafeHtmlBuilder sb = new SafeHtmlBuilder();
List<T> replaceValues = newState.rowData.subList(relStart, relStart + range1.getLength());
view.replaceChildren(replaceValues, relStart, selectionModel, newState.keyboardStealFocus);
}
view.resetFocus();
Метод view.replaceAllChildren(....) вызывает рендеринг метода рендеринга ячеек, а когда он завершает работу ValueChangeEvent().
@Override
public void replaceAllChildren(....) {
SafeHtml html = renderRowValues(...);
....
fireValueChangeEvent();
}
Поэтому в вашем cellList вы должны сделать что-то вроде:
cellList.addHandler(new ValueChangeHandler<List<IPost>>() {
@Override
public void onValueChange(ValueChangeEvent<List<IPost>> event) {
//Do something
//Be careful because this handler could be called from other methods
}
}, ValueChangeEvent.getType());
Ссылаясь на пример виджета GWT CellList
Вы можете использовать собственный пользовательский ящик, расширяющий AbstractCell (как используется ContactCell в примере).
Там вам нужно переопределить метод визуализации:
@Override public void render (контекст контекста, значение ContactInfo, SafeHtmlBuilder sb) {
(//other codes)
(// put your logic after render here at the last)
}