我使用 GWT CellList widget 来渲染 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 单元格列表小部件示例
您可以使用自己的自定义 Cell 扩展 AbstractCell(如示例中使用的 ContactCell)。
在那里,您需要覆盖渲染方法:
@Override public void render(Context context, ContactInfo value, SafeHtmlBuilder sb) {
(//other codes)
(// put your logic after render here at the last)
}