测量'Flex组件

我正在实现一个自定义的Flex组件,该组件提供了一个可滚动的视图到一个(可能非常大的)数据网格上。 我使用ItemRenderer模式,这样我就只有UIComponents在给定的时间在屏幕上可见的元素。 换句话说,类似于标准DataGrid控件。

我要求的一个要求是动态调整网格单元的大小以适应所提供的数据,从而使列宽度和行高度在前面已知。 (当用户滚动并看到新的单元格时,列宽和行高不会波动。)

这个要求意味着当组件的dataSource或itemRenderer被改变时,整个网格的“预先测量”阶段被执行。 我想使用标准Flex组件测量操作来执行此预测量阶段。

我现在的这个测量前阶段的策略是:

  • 获取一个itemRenderer实例
  • 初始化itemRenderer
  • 对于数据源中的每个单元格:
  • 将itemRenderer的'data'对象设置为该单元格的数据
  • '组件上的'commitProperties()'
  • 'measure()'组件
  • 根据测量结果适当更新列宽/行高
  • 我宁愿不将itemRenderer附加到应用程序的显示列表中,但这意味着它不会被框架初始化。 另外,我需要渲染器的初始化和commitProperties / measurement阶段同步发生。 我害怕我必须复制多少Flex组件生命周期管理框架才能完成此任务。

    所以我呼吁那些比我更有经验的人用智慧的话来说:

  • 对这个策略的可行性有什么想法?
  • 关于如何优雅地使用框架来为我执行这个测量的任何建议?
  • 任何更好的策略来确定细胞大小?

  • 我研究了框架代码,如果初步结果是一个迹象,这并不像我担心的那样痛苦。 它的胆量:

    var renderer:IListItemRenderer = getRenderer();
    renderer.initialize();
    for each (var cell:Object in cells) {
        renderer.data = cell;
        renderer.validateProperties();
        renderer.validateSize(true);
        // Access renderer's size properties here
    }
    

    将'recursive = true'标志传递给validateSize是我之前缺少的关键。 不幸的是,没有用于validateProperties的等效标志,所以我可能必须自己实现这个标志才能使它对于任意ItemRenderer是可靠的。


    我从来没有以这种方式应用itemRenderer,所以,不知道这会发挥多大的作用,你是接近,但你设置

    super.data = data

    在渲染器的数据设置器的顶部? 即:

    override public function set data(value:Object):void
    {
    super.data = value;
    ...
    }

    如果没有,你可以尝试添加它,看看它是否消除了在validateProperties()递归标志的需要。

    链接地址: http://www.djcxy.com/p/34591.html

    上一篇: measuring' Flex Components

    下一篇: ItemRenderer height (and height changes) not reflected in AdvancedDataGrid row