How to redraw a specific node in gwt cell tree

I am implementing a directory structure such as Windows Explorer. I want to redisplay a specific node of the tree after performing any operations with folders, such as adding a folder, deleting a folder ... etc.

private ListDataProvider<Object> dataProvider= new ListDataProvider<Object>(); private Object current;//store object of currentNode; private Map<Object, ListDataProvider<Object>> keyprovider = new HashMap<Object,ListDataProvider<Object>>(); private CellTree tree; // keeps a map for storing dataproviders in each hierarchy , public void setListToCurrentNode(List<Object> newList){ //adding this newlist to current data provider not reflecting to display keyprovider.get(currentObject).setList(newList); } public void onModuleLoad(){ treeSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { //setting current object as selected node current = treeSelectionModel.getSelectedObject(); } }); } 
+4
source share
2 answers

Solved by changing Listdataprovider to AsyncDataProvider, implementation below

 private final class DataProvider extends AsyncDataProvider<Object> { private Object value; private List Objs; DataProvider(Object value) { this.value = value; } public void update(List objs) {//Call update when you wanted to refresh tree this.objs=objs; for (HasData<Object> disp : getDataDisplays()) { this.onRangeChanged(disp); break; } } @Override protected void onRangeChanged(final HasData<Object> display) { updateRowData(0, objs); updateRowCount(objs.size(), true); } 
0
source

Data providers force re-mapping of the corresponding DOM. The code below demonstrates how this works. This example creates a two-level tree in which you can update (regenerate) leaf nodes by pressing the Enter key on the selected root node directory.

I tried to keep the code as simple as possible, all the necessary materials were contained here.

 public class TestEntryPoint implements EntryPoint { private static final Logger LOG = Logger.getLogger(TestEntryPoint.class.getName()); class Item { String name; boolean leaf; public Item(String name, boolean leaf) { this.name = name; this.leaf = leaf; } @Override public String toString() { return "Item {name=" + name + ", leaf=" + leaf + "}"; } } class ItemCell extends AbstractCell<Item> { public ItemCell() { super("keydown"); } @Override public void render(Context context, Item value, SafeHtmlBuilder sb) { if (value != null) sb.appendEscaped(value.name); } @Override protected void onEnterKeyDown( Context context, Element parent, Item value, NativeEvent event, ValueUpdater<Item> valueUpdater) { LOG.info("ItemCell.onEnterKeyDown: value=" + value); if (value == null || value.leaf) return; ListDataProvider<Item> leafDataProvider = leafDataProviders.get(value.name); if (leafDataProvider == null) return; // -->> Here we generate new childs of selected root node leafDataProvider.setList(generateLeafs()); } } class ItemTreeViewModel implements TreeViewModel { @Override public <T> NodeInfo<?> getNodeInfo(T value) { return new DefaultNodeInfo<Item>( value == null ? rootDataProvider : leafDataProviders.get(((Item) value).name), new ItemCell()); } @Override public boolean isLeaf(Object value) { return (value instanceof Item) && ((Item) value).leaf; } } private int id = 0; private CellTree cellTree; private ListDataProvider<Item> rootDataProvider; private Map<String, ListDataProvider<Item>> leafDataProviders = new HashMap<String, ListDataProvider<Item>>(); private List<Item> generateLeafs() { List<Item> leafList = new ArrayList<Item>(5); for (int j = 0; j < 5; ++j) leafList.add(new Item("Leaf Item " + (++id), true)); return leafList; } public void onModuleLoad() { List<Item> rootList = new ArrayList<Item>(10); for (int i = 0; i < 10; ++i) { Item rootItem = new Item("Root Item " + (++id), false); rootList.add(rootItem); leafDataProviders.put(rootItem.name, new ListDataProvider<Item>(generateLeafs())); } rootDataProvider = new ListDataProvider<Item>(rootList); cellTree = new CellTree(new ItemTreeViewModel(), null); cellTree.setAnimationEnabled(true); RootLayoutPanel.get().add(cellTree); } } 
+1
source

Source: https://habr.com/ru/post/1480970/


All Articles