2011-08-30 23 views
6

Tôi muốn bắn các "nút gốc mở" sự kiện trên CellTree làm việc hiện tại của tôi, mà bây giờ có những hành vi sau đây:Programatically làm mới một Gwt CellTree

@Override 
    public <T> NodeInfo<?> getNodeInfo(final T value) { 
     return new DefaultNodeInfo<Categoria>(
       (value instanceof Categoria) ? 
         createBranchDataProvider((Categoria)value) : 
         rootDataProvider, 
       new CategoriaCell() 
     ); 
    } 

private AsyncDataProvider<Categoria> createRootDataProvider() { 
     AsyncDataProvider<Categoria> dataProvider = new AsyncDataProvider<Categoria>() { 
      @Override 
      protected void onRangeChanged(HasData<Categoria> display) { 
       AsyncCallback<Categoria[]> cb = new AsyncCallback<Categoria[]>() { 
        @Override 
        public void onSuccess(Categoria[] result) { 
         updateRowCount(result.length, true); 
         updateRowData(0, Arrays.asList(result)); 
        } 
        @Override 
        public void onFailure(Throwable caught) { 
         Window.alert(caught.toString()); 
        } 
       }; 
       rpcService.getCategorie(cb); 
      } 
     }; 
     return dataProvider; 
    } 

Làm thế nào tôi có thể bắn mà "onRangeChanged" sự kiện, để làm mới các nút cấp 1 của tôi?

Phương pháp tiện lợi của tôi bị thiếu là gì?

private void updateTree() {  
     TreeNode rootTreeNode = cellTree.getRootTreeNode(); 
     for (int i = 0; i < rootTreeNode.getChildCount(); i++) { 
      rootTreeNode.setChildOpen(i, false); 
     } 
     // HOW TO REFRESH LEVEL-1 NODES? 
    } 

Trả lời

2

Nút mức 1 (Tôi cho rằng bạn có nghĩa là dưới nút gốc) không thể làm mới theo cách bạn đang thực hiện.

Bạn phải lưu trữ cá thể của DataProvider của bạn cho các nút cấp 1 ở đâu đó. Sau đó khi bạn làm mới danh sách của mình, bạn phải cập nhật trình lưu trữ dữ liệu được lưu trữ cho các nút cấp 1 của bạn.
Các nút bên dưới mức 1 có thể được làm mới theo cách bạn đang thực hiện. Bởi vì ngay sau khi bạn đóng các nút cấp 1 (đó là những gì bạn đang làm trong phương thức updateTree) và lần sau bạn mở nó getNodeInfo sẽ được gọi và các Tiểu thể loại được cập nhật sẽ được truy xuất và hiển thị trong CellTree.

CẬP NHẬT

Đối với làm mới CellWidgets mà được gắn vào AsyncDataProvider có thể bạn sẽ phải mở rộng AsyncDataProvider và hoặc trích xuất các cuộc gọi RPC đến một phương pháp getData() được gọi trong onRangeChanged() phương pháp hoặc tạo interface with a refresh method và triển khai nó trong AsyncDataProvider tùy chỉnh của bạn gọi phương thức onRangeChanged() được bảo vệ.

+0

<< Sau này khi bạn làm mới danh sách của bạn, bạn phải cập nhật dataProvider bạn được lưu trữ cho các nút cấp 1 của bạn. >> Tốt!^___^nhưng ... LÀM THẾ NÀO?!? -.- 'Tôi có nghĩa là, phương pháp duy nhất có sẵn trên nhà cung cấp là updateRowData(), tôi có phải sao chép mã rpc có trong onRangeChanged(), hoặc tôi có thể kích hoạt sự kiện "range changed" theo một cách nào đó ?? cảm ơn –

+0

xem câu trả lời cập nhật của tôi –

4

Ví dụ làm việc. Thêm tham chiếu đến DataProvider (và nút cha) (MyMenuItem và MyCell với DataProvider trong mã của tôi). Sau khi thêm phụ huynh làm mới phần tử.

public class MyMenuItem { 
    private String name; 
    private String action; //some data 
    private int level; //if needed 
    private ArrayList<MyMenuItem> list; //nodes childrens 
    private MyMenuItem parent; //track internal parent 
    private MyCell cell; //for refresh - reference to visual component 

    public void setCell(MyCell cell) { 
     this.cell = cell; 
    } 
    public void refresh() { 
     if(parent!=null) { 
      parent.refresh(); 
     } 
     if (cell!=null) { 
      cell.refresh(); //refresh tree 
     } 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getAction() { 
     return action; 
    } 
    public void setAction(String action) { 
     this.action = action; 
    } 
    public MyMenuItem(String name, String action) { 
     super(); 
     parent = null; 
     level = 0; 
     this.name = name; 
     this.action = action; 
     list = new ArrayList<MyMenuItem>(); 
    } 
    public MyMenuItem(String name) { 
     this(name, ""); 
    } 
    public void addSubMenu(MyMenuItem m) { 
     m.level = this.level+1; 
     m.parent = this; 
     list.add(m); 
    } 

    public boolean hasChildrens() { 
     return list.size()>0; 
    } 
    public int getLevel() { 
     return level; 
    } 
    public void setLevel(int level) { 
     this.level = level; 
    } 
    public ArrayList<MyMenuItem> getList() { 
     return list; 
    } 
    public MyMenuItem getParent() { 
     return parent; 
    } 
} 

public class MyTreeModel implements TreeViewModel { 
    private MyMenuItem officialRoot; //default not dynamic 
    private MyMenuItem studentRoot; //default not dynamic 
    private MyMenuItem testRoot; //default not dynamic 
    private MyMenuItem root; 

    public MyMenuItem getRoot() { // to set CellTree root 
     return root; 
    } 

    public MyTreeModel() { 
     root = new MyMenuItem("root"); 
     // Default items 
     officialRoot = new MyMenuItem("Official"); //some basic static data 
     studentRoot = new MyMenuItem("Student"); 
     testRoot = new MyMenuItem("Test"); 
     root.addSubMenu(officialRoot); 
     root.addSubMenu(studentRoot); 
     root.addSubMenu(testRoot); 
    } 

    //example of add add logic 
    private void addNew(MyMenuItem myparent, String name, String uid) { 
     myparent.addSubMenu(new MyMenuItem(name, uid)); 
     myparent.refresh(); //HERE refresh tree 
    } 

    @Override 
    public <T> NodeInfo<?> getNodeInfo(T value) { 
     ListDataProvider<MyMenuItem> dataProvider; 
     MyMenuItem myValue = null; 
     if (value == null) { // root is not set 
      dataProvider = new ListDataProvider<MyMenuItem>(root.getList()); 
     } else { 
      myValue = (MyMenuItem) value; 
      dataProvider = new ListDataProvider<MyMenuItem>(myValue.getList()); 
     } 
     MyCell cell = new MyCell(dataProvider); //HERE Add reference 
     if (myValue != null) 
      myValue.setCell(cell); 
     return new DefaultNodeInfo<MyMenuItem>(dataProvider, cell); 
    } 

    @Override 
    public boolean isLeaf(Object value) { 
     if (value instanceof MyMenuItem) { 
      MyMenuItem t = (MyMenuItem) value; 
      if (!t.hasChildrens()) 
       return true; 
      return false; 
     } 
     return false; 
    } 

} 

public class MyCell extends AbstractCell<MyMenuItem> { 
     ListDataProvider<MyMenuItem> dataProvider; //for refresh 
     public MyCell(ListDataProvider<MyMenuItem> dataProvider) { 
      super("keydown","dblclick"); 
      this.dataProvider = dataProvider; 
     } 
     public void refresh() { 
      dataProvider.refresh(); 
     } 
     @Override 
     public void onBrowserEvent(Context context, Element parent, MyMenuItem value, 
      NativeEvent event, ValueUpdater<MyMenuItem> valueUpdater) { 
      if (value == null) { 
      return; 
      } 
      super.onBrowserEvent(context, parent, value, event, valueUpdater); 
      if ("click".equals(event.getType())) { 
      this.onEnterKeyDown(context, parent, value, event, valueUpdater); 
      } 
      if ("dblclick".equals(event.getType())) { 
       this.onEnterKeyDown(context, parent, value, event, valueUpdater); 
      } 
     } 

     @Override 
     public void render(Context context, MyMenuItem value, SafeHtmlBuilder sb) { 
      if (value == null) { 
      return; 
      } 
      sb.appendEscaped(value.getName()); 
      //add HERE for better formating 
     } 


     @Override 
     protected void onEnterKeyDown(Context context, Element parent, 
       MyMenuItem value, NativeEvent event, ValueUpdater<MyMenuItem> valueUpdater) { 
      Window.alert("You clicked "+event.getType()+" " + value.getName()); 
     } 


} 

trong mô-đun thêm

treeModel = new MyTreeModel(); 
tree = new CellTree(treeModel,treeModel.getRoot()); 
Các vấn đề liên quan