मैं कस्टम TreeViewModel
के साथ जीडब्ल्यूटी 2.1 के CellBrowser का उपयोग कर रहा हूं। बदले में TreeViewModel डेटा को गतिशील रूप से लाने के लिए AsyncDataProvider
का उपयोग करता है। यह सब खूबसूरती से काम करता है- जब उपयोगकर्ता नोड पर क्लिक करता है तो मेरा AsyncDataProvider आरपीसी के माध्यम से परिणाम प्राप्त करता है, और सेलब्रोसर कर्तव्यपूर्वक उन्हें प्रदर्शित करता है।जीडब्ल्यूटी: प्रोग्रामब्रेटिक रूप से सेलब्रोसर को फिर से लोड कैसे करें?
मुझे यह समझने में सक्षम नहीं होने के लिए मूर्खतापूर्ण लगता है, लेकिन मैं डेटाब्राउज़र को डेटा को पुनः लोड (और प्रदर्शित) करने के लिए प्रोग्रामेटिक रूप से कैसे बता सकता हूं? मुझे लगता है कि मुझे किसी भी तरह से मेरे रूट नोड के लिए AsyncDataProvider को एक हैंडल प्राप्त करने की आवश्यकता है और उसके बाद UpdateRowData() & UpdateRowCount() पर कॉल करें, लेकिन मुझे ब्राउज़र (या उसके मॉडल) से पूछताछ करने का एक स्पष्ट तरीका दिखाई नहीं देता है। रूट डेटाप्रोवाइडर के लिए।
मुझे लगता है कि मैं अपने असिनकडाटाप्रोवाइडर कन्स्ट्रक्टर को कोड जोड़ सकता हूं जो एक शून्य तर्क की तलाश में है, और इसका मतलब है "अरे, मैं रूट हूं" और कहीं एक संदर्भ संग्रहीत करता हूं, लेकिन यह हैक लगता है। निश्चित रूप से ऐसा करने का एक बेहतर तरीका है।
यहां बहुत अधिक कोड डंप करने के लिए क्षमा चाहते हैं, लेकिन मुझे नहीं पता कि इसे किसी भी चीज़ को सरल कैसे उबालें और अभी भी पर्याप्त संदर्भ प्रदान करें।
मेरे 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();
}
}
मेरे मॉडल:
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();
}
}
और अंत में, यहाँ मैं उन्हें कैसे उपयोग कर रहा हूँ है:
CategoryTreeModel model = new CategoryTreeModel(selectionModel);
CellBrowser cellBrowser = new CellBrowser(model, null);
"हैशरफ्रेश" पर टाइपो लेकिन अन्यथा +1! :) – HaveAGuess
हर कोई इस जवाब को क्यों वोट दे रहा है? नीचे दिया गया एक बहुत बेहतर है - एक पंक्ति परिवर्तन जो यह सब करता है। –
अद्यतनरोडाटा (प्रारंभ, प्रतिक्रिया.getEntities()) प्रदाता के लिए सभी डिस्प्ले अपडेट करें, आप इसके बजाय UpdateRowData (प्रदर्शन, प्रारंभ, प्रतिक्रिया.getEntities()) का उपयोग कर सकते हैं। लेकिन display.setVisibleRangeAndClearData (display.getVisibleRange(), true) अभी भी बेहतर है :) – Quiz