GXT在TreeStore中重新排列数据数组索引

时间:2015-09-30 02:29:12

标签: gxt

目前,我正在使用gxt 3.0.6

我有一个TreeStore让我们称它为“treeStore”,模型数据为“ParentDto”。

private TreeStore<ParentDto> treeStore;
treeStore = new TreeStore<ParentDto>(new ModelKeyProvider<ParentDto>(){
              @Override
               public String getKey(ParentDto item){
                   return String.valueOf(item.getParentId());
               }
          });

在ParentDto中有一个ChildDto列表。如果有ParentDto数据有ChildDto列表,我想在树状网格中显示它。我从这个链接使用基本树网格 https://www.sencha.com/examples/#ExamplePlace:basictreegrid

使用该引用,如果我尝试添加1个ParentDto,一切正常,但问题是当我添加许多Parent Dto时。 这是我将数据添加到treeStore

的代码
public void fillTreeStore(List<ParentDto) listParent){
   treeStore.clear();
   for(ParentDto parentDto : listParent){
      treeStore.add(parentDto);
      if(parentDto.getListChild().size() > 0){
        for(ChildDto childDto : parent.getListChild()){
            treeStore.add(parentDto,childDto);
        }
       }
}

在我的情况下,我只需要1级父子树,所以这段代码就足够了。 我尝试调试我的代码使用这个表达式

treeStore.getAll().get(index);

当我添加1个ParentDto(parentA)时,它有1个Child(childA)。结果将是

treeStore.getAll().get(0) -> contain parentA
treeStore.getAll().get(1) -> contain childA

但是如果我添加2个ParentDto(parentA,parentB)并且每个都有1个子节点(childA,childB)。结果将是

treeStore.getAll().get(0) -> contain parentA
treeStore.getAll().get(1) -> contain parentB
treeStore.getAll().get(2) -> contain childA
treeStore.getAll().get(3) -> contain childB

但在网格中,这些数据将完全展现出来:

row 1 : parentA (this row can expand)
row 2 : childA (the expanded row form parentA)
row 3 : parentB (this row can expand)
row 4 : childB (the expanded row form parentB)

如果数据是“父”,我需要渲染图标,所以我使用这段代码:

(icon_variable).addBeforeRenderIconCellEventHandler(new BeforeRenderIconCellEventHandler() {

            @Override
            public void onBeforeRenderIconCell(BeforeRenderIconCellEvent event) {
                if(treeStore.getParent(treeStore.get(event.getSelectedRowIndex())) == null){
                   //#render icon here
                 }
            }
        });

问题在于此代码

treeStore.get(event.getSelectedRowIndex())

添加parentB后,它将触发addBeforeRenderIconCellEventHandler方法。 event.getSelectedRowIndex()将根据“网格视角”获取行索引。在第二行,从网格的角度来看(childA),event.getSelectedRowIndex()将返回1.但是从“treeStore的角度来看”,索引1是“parentB”,所以我的图标渲染混乱了。

这就是为什么,我在treeStore中需要的结果是这样的

treeStore.getAll().get(0) -> contain parentA
treeStore.getAll().get(1) -> contain childA
treeStore.getAll().get(2) -> contain parentB
treeStore.getAll().get(3) -> contain childB

我的解决方案: 为了解决这个问题,我现在使用2个商店,第一个是TreeStore,第二个是ListStore。每次添加父级和子级时,我都会将它们插入TreeStore和ListStore。在ListStore中,我保持父和子的索引始终与网格的透视图匹配,这样每当触发addBeforeRenderIconCellEventHandler时,我都使用ListStore来获取数据。

在我看来,这个解决方案还不够好,但因为在我的情况下,最大数据可以添加到商店中小于50,这就足够了。

1 个答案:

答案 0 :(得分:0)

看起来这是默认行为。你没有说出你想要做的是什么,但我猜你可以用它们提供的方法来做。我猜你试图通过查看父母及其所有孩子来遍历树,然后再转到下一个父母。像这样的东西就可以做到。

for (ParentDto parent : treeStore.getRootItems()){
    for (ChildDto child : treeStore.getChildren(parent)){
    }
}