That was a good idea and it does get rid of the arraycollection walking. But I get the SAME problem with the grid losing highlighting when I did it using AdvancedGridItemRenderer, thought the symptoms are slightly different:
<?xml version="1.0" encoding="utf-8"?> <Application xmlns="http://www.adobe.com/2006/mxml" creationComplete="cc()" layout="horizontal" > <Script> <![CDATA[ import mx.events.ListEvent; import mx.collections.ArrayCollection; [Bindable] public var d:ArrayCollection = new ArrayCollection([]); private const ITEM_COUNT:int = 15; private function cc():void { for (var i:int = 0; i < ITEM_COUNT; i++) { var item:TestObject = new TestObject; item.label = "Item " + i; d.addItem(item); } } private function getColStyle(data:Object, column:AdvancedDataGridColumn):Object { return { fontWeight:(data.highlighted ? "bold" : "normal") } } ]]> </Script> <AdvancedDataGrid id="list" dataProvider="{d}" height="100%"> <columns> <AdvancedDataGridColumn styleFunction="getColStyle" dataField="label"> <itemRenderer> <Component> <AdvancedDataGridItemRenderer> <Script> <![CDATA[ import mx.controls.AdvancedDataGrid; override public function validateNow():void { var adg:AdvancedDataGrid = owner as AdvancedDataGrid; if (data && adg) data.highlighted = adg.isItemHighlighted(data); super.validateNow(); } ]]> </Script> </AdvancedDataGridItemRenderer> </Component> </itemRenderer> </AdvancedDataGridColumn> </columns> </AdvancedDataGrid> </Application> In this example, I don't loop through the dataprovider but instead only affect the itemRenderer being redrawn. Yet if you try this example with highlighted being a [Bindable] variable, it breaks, not just failing to show the highlighted item in bold but also breaking the grid's blue highlight. Comment out the [Bindable] part in TestObject, and it works just fine. I'm hoping Alex is still following along. I'm trying to get my itemRenderers in a big complicated grid as lean as possible, as per Alex's suggestions on his blog. The highlighted data is also being used in a couple of different places that are abstracted a bit, otherwise I'd hardcode something a bit more kludgy. On Fri, Jun 5, 2009 at 2:41 PM, Tim Hoff <[email protected]> wrote: > > > Hi Jason, > > Have you tried it from within the itemRenderer? Something like: > * > > private > * *var* adg : AdvancedDataGrid; > > *override* *public* *function* *set* data(value:Object):*void* > { > * super*.data = value; > > adg = owner *as* AdvancedDataGrid; > } > > *override* *protected* *function* updateDisplayList( w:Number, h:Number ): > *void > *{ > * super*.updateDisplayList( w, h ); > > data.highlighted = adg.isItemHighlighted(data); > } > > Not sure if this will work for your purposes, but it's worth a shot. > > -TH > > > --- In [email protected], Pan Troglodytes <chimpathe...@...> > wrote: > > > > Yes. A gigantic 15 items. ;) I wouldn't have thought going through a list > > of 15 items would be quite so processor intensive. > > > > Though even if it's just 5 items and I use Array instead of > ArrayCollection, > > it's still choppy. > > > > The problem isn't so much that it's scanning through the entire > collection, > > as if you change "item.highlighted = list.isItemHighlighted(item)" to " > > trace('here');", the choppiness disappears. > > > > So, the problem is that it's setting this bound variable highlighted 15 > > times (or even just 5) for each item as it rolls over them. And the > strange > > thing is that the data all gets set behind the scenes. What happens that > > the grid cells don't get repainted properly. If you actually play with > the > > program a little, dragging your mouse around a bit, you'll see what I'm > > talking about. Here's a video that might be helpful: > > > > http://www.youtube.com/watch?v=7LQFlQtiHsc > > > > So it seems odd to me that the data is getting updated but the grid is > > losing track of the ability to highlight. > > > > You know what's really interesting? Change the style function this: > > private function getColStyle(data:Object, > > column:AdvancedDataGridColumn):Object > > { > > return { fontWeight:(data.highlighted ? "bold" : "normal") } > > } > > > > Now you'll see that the bolding tracks perfectly! The reason it failed > > before was the same reason the blue mouseover highlight was failing. > > Internally, the grid is losing the ability to highlight. > > > > On Thu, Jun 4, 2009 at 11:28 PM, Alex Harui aha...@... wrote: > > > > > > > > > > > The rollover handler is scanning the entire arraycollection. > > > > > > > > > > > > Alex Harui > > > > > > Flex SDK Developer > > > > > > Adobe Systems Inc. <http://www.adobe.com/> > > > > > > > Blog: http://blogs.adobe.com/aharui > > > > > > > > > > > > *From:* [email protected] [mailto:[email protected]] > *On > > > Behalf Of *Pan Troglodytes > > > *Sent:* Thursday, June 04, 2009 12:00 PM > > > *To:* flexcoders > > > *Subject:* [flexcoders] how to fix poor performance in this example > > > (AdvancedDataGrid and Binding) > > > > > > > > > > > > > > > > > > > > > I have the following example that is a very simplified form of what I > > > need to do in my much larger program. The goal is to have a mouseover > on a > > > grid item set a variable in the data object. In the real program, this > > > fires off some other code which makes that item visible and the others > > > hidden, etc. But here, I'm just trying the first part. > > > > > > *TestObject.as:* > > > package > > > { > > > public class TestObject > > > { > > > [Bindable] public var label:String; > > > [Bindable] public var highlighted:Boolean; > > > } > > > } > > > > > > *GenericTest.mxml: > > > *<?xml version="1.0" encoding="utf-8"?> > > > <Application > > > xmlns="http://www.adobe.com/2006/mxml" > > > creationComplete="cc()" > > > layout="horizontal" > > > > > > > <Script> > > > <![CDATA[ > > > import mx.events.ListEvent; > > > import mx.collections.ArrayCollection; > > > [Bindable] public var d:ArrayCollection = new ArrayCollection([]); > > > > > > private const ITEM_COUNT:int = 15; > > > > > > private function cc():void > > > { > > > for (var i:int = 0; i < ITEM_COUNT; i++) > > > { > > > var item:TestObject = new TestObject; > > > item.label = "Item " + i; > > > d.addItem(item); > > > } > > > } > > > > > > private function listRollover(e:ListEvent):void > > > { > > > for each (var item:TestObject in d) > > > item.highlighted = list.isItemHighlighted(item); > > > } > > > > > > private function getColStyle(data:Object, > > > column:AdvancedDataGridColumn):Object > > > { > > > return { fontWeight:(list.isItemHighlighted(data) ? "bold" : > > > "normal") } > > > } > > > > > > private function getColStyle2(data:Object, > > > column:AdvancedDataGridColumn):Object > > > { > > > return { fontWeight:(list2.isItemHighlighted(data) ? "bold" : > > > "normal") } > > > } > > > > > > ]]> > > > </Script> > > > <AdvancedDataGrid id="list" dataProvider="{d}" height="100%" > > > itemRollOver="listRollover(event)"> > > > <columns> > > > <AdvancedDataGridColumn styleFunction="getColStyle" > > > dataField="label"/> > > > </columns> > > > </AdvancedDataGrid> > > > <AdvancedDataGrid id="list2" dataProvider="{d}" height="100%"> > > > <columns> > > > <AdvancedDataGridColumn styleFunction="getColStyle2" > > > dataField="label"/> > > > </columns> > > > </AdvancedDataGrid> > > > </Application> > > > > > > To see the problem, run your mouse up and down the list on the left and > the > > > list on the right. If you get the same results I do with SDK 3.0.2 and > > > player 10,0,12,36 (FF 3.0.6 or IE 7), you'll see that the list on the > right > > > tracks very smoothly but the one on the left is choppy. The only > difference > > > between the two is that the one on the left has a rollOver handler that > sets > > > a Bindable variable in the data object. > > > > > > If you comment out the [Bindable] on TestObject's highlighted variable, > the > > > choppiness goes away. So it's something to do with all the binding glue > > > being fired behind the scenes. Is there some good way to work around > this > > > while still being able to use binding in this way? > > > > > > -- > > > Jason > > > > > > > > > > > > > > > > > -- > > Jason > > > > -- Jason

