Sto utilizzando GWT 2.1 CellBrowser con un numero personalizzato TreeViewModel
. TreeViewModel utilizza a sua volta uno AsyncDataProvider
per recuperare i dati dinamicamente. Tutto funziona alla perfezione: quando l'utente fa clic su un nodo, AsyncDataProvider preleva i risultati tramite RPC e CellBrowser li visualizza diligentemente.GWT: come ricaricare a livello di codice CellBrowser?
Mi sento sciocco per non essere in grado di capirlo, ma come posso dire a livello di codice al CellBrowser di ricaricare (e visualizzare) i dati? Sto indovinando che ho bisogno di ottenere in qualche modo un handle per AsyncDataProvider per il mio nodo radice e quindi chiamare updateRowData() & updateRowCount() su di esso, ma non vedo un modo ovvio per interrogare il browser (o il suo modello) per il root DataProvider.
Suppongo di poter aggiungere codice al mio costruttore AsyncDataProvider che cerca un argomento nullo, e in questo modo riconosco "hey, sono la radice" e memorizzo un riferimento da qualche parte, ma sembra logico. Sicuramente c'è un modo migliore per farlo.
Ci scusiamo per aver scaricato così tanto codice qui, ma non so come ridurlo a nulla di più semplice e fornire ancora un contesto sufficiente.
mio AsyncDataProvider:
private static class CategoryDataProvider extends AsyncDataProvider<Category>
{
private Category selectedCategory;
private CategoryDataProvider(Category selectedCategory)
{
this.selectedCategory = selectedCategory;
}
@Override
protected void onRangeChanged(HasData<Category> display)
{
new AsyncCall<List<Category>>()
{
@Override
protected void callService(AsyncCallback<List<Category>> cb)
{
// default to root
String categoryId = "-1";
if (selectedCategory != null)
{
categoryId = selectedCategory.getCategoryId();
}
// when a category is clicked, fetch its child categories
service.getCategoriesForParent(categoryId, cb);
}
@Override
public void onSuccess(List<Category> result)
{
// update the display
updateRowCount(result.size(), true);
updateRowData(0, result);
}
}.go();
}
}
Il mio modello:
private static class CategoryTreeModel implements TreeViewModel
{
private SingleSelectionModel<Category> selectionModel;
public CategoryTreeModel(SingleSelectionModel<Category> selectionModel)
{
this.selectionModel = selectionModel;
}
/**
* @return the NodeInfo that provides the children of the specified category
*/
public <T> NodeInfo<?> getNodeInfo(T value)
{
CategoryDataProvider dataProvider = new CategoryDataProvider((Category) value);
// Return a node info that pairs the data with a cell.
return new TreeViewModel.DefaultNodeInfo<Category>(dataProvider, new CategoryCell(), selectionModel, null);
}
/**
* @return true if the specified category represents a leaf node
*/
public boolean isLeaf(Object value)
{
return value != null && ((Category) value).isLeafCategory();
}
}
E, infine, ecco come io li sto usando:
CategoryTreeModel model = new CategoryTreeModel(selectionModel);
CellBrowser cellBrowser = new CellBrowser(model, null);
typo su "HashRefresh" ma altrimenti +1! :) – HaveAGuess
Perché tutti votano questa risposta? Quello sotto è molto meglio - un cambio di riga singolo che fa tutto questo. –
updateRowData (start, response.getEntities()) aggiorna tutti i display per il provider, è possibile utilizzare updateRowData (display, start, response.getEntities()). Ma display.setVisibleRangeAndClearData (display.getVisibleRange(), true) è ancora meglio :) – Quiz