1

我找到了几个关于 CellRenderer 的教程,它们将更改整个列表或选定的项目,但我对 AS3 还不是很好,需要一些帮助。我正在从 xml 文件加载用户列表。一切都加载得很好,但我想做的实际上是按组着色。

再次,它很好地加载到列表中,我要做的是在从 xml 文件添加它们的循环中,如果它的管理员将其设为红色字体,mod 为绿色字体,成员为黑色。

请问有什么帮助吗?

4

1 回答 1

0

有几个注意事项需要注意:

  1. 如果您打算使用字体格式,还需要将渲染器样式 embedFonts设置为 true
  2. 由于您想为单个单元格设置样式,首先您需要等待列表被填充(完成它是组件生命周期的内部数据设置部分)。这可以通过调用drawNow()invalidate()来强制
  3. 最后,在渲染处理程序中,通过itemToCellRender()方法访问单个单元格渲染器以设置样式。

这是一个基本示例(并将 a、b、c 想象为 admin、mod、member):

//in a setup function
{
//some dummy data
            var data:XML = <users>
                            <user name="user 1" group="a" />
                            <user name="user 2" group="a" />
                            <user name="user 3" group="a" />
                            <user name="user 4" group="b" />
                            <user name="user 5" group="b" />
                            <user name="user 6" group="b" />
                            <user name="user 7" group="c" />
                            <user name="user 8" group="c" />
                            <user name="user 9" group="c" />
                           </users>
            //create a list
            var list:List = addChild(new List()) as List;
            list.setSize(600,400);
            list.move(0,400);
            //setup a font AND set embefFonts to true
            list.setRendererStyle("textFormat",new TextFormat("Siemens Sans SC Black",11,0xFF9900));
            list.setRendererStyle("embedFonts",true);
            //populate list
            for(var i:int = 0 ; i < data.user.length(); i++) list.addItem({label:String(data.user[i].@name),group:String(data.user[i].@group)});
            list.invalidate();//tell list to refresh itself
            list.addEventListener(Event.RENDER,listUpdated);//listen for the refresh
}
        //after the list refreshed
        private function listUpdated(event:Event):void{
            //setup text formats
            var formats:Dictionary = new Dictionary();
            formats["a"] = new TextFormat("Siemens Sans SC Black",11,0x990000); 
            formats["b"] = new TextFormat("Siemens Sans SC Black",11,0x009900); 
            formats["c"] = new TextFormat("Siemens Sans SC Black",11,0x000099);

            var list:List = List(event.currentTarget);
            for(var i:int = 0 ; i < list.dataProvider.length; i++) {
                var item:Object = list.getItemAt(i);
                var cr:CellRenderer = CellRenderer(list.itemToCellRenderer(item));//get the individual cell renderers
                cr.setStyle("textFormat",formats[item.group]); //set styles per cell
            }
            list.removeEventListener(Event.RENDER,listUpdated);//clear listener
        }
于 2012-09-18T22:37:10.343 回答