|
Viewing By Entry / Main
15 Sep. 2008
In response to some requests I got from friends wanting some more real world ItemRenderer examples, here is one that approaches the item renderer from a graphical approach and brings together some different techniques to create a nicely featured ItemRenderer. Here is what this example DataGrid/ItemRender demonstrates:
DataProvider and ValueObjects
private function httpResult_handler(evt:ResultEvent):void { if (evt.result.people.person) { //result var resultAC:ArrayCollection = evt.result.people.person as ArrayCollection; //loop through each item in data for (var i:int=0;i<resultAC.length;i++) { //create person VO var person:Person = new Person(); //add data person.fill(resultAC[i]); //add person to main data provider peopleDataProvider.addItem(person); } } }
ItemRenderer and Override of 'set data' [Bindable]private var person:Person; override public function set data(value:Object):void { super.data = value; if (value is Person) { person = Person(value); } } When overriding the set data function make sure to remember set 'super.data=value'. The ItemRenderer still needs to know the value of the data otherwise it will be treated like an empty row in the DataGrid.
Swap ItemRenderer Images Based on Data <mx:Image id="gender_img" source="{getGenderImg(person.gender)}"... Since the person variable is Bindable if there is a change the 'getGenderImg' function will be asked to give the image its source: private function getGenderImg(gender:String):Class { if (gender == Person.GENDER_FEMALE) { return imgUserFemale; } else { return imgUserMale; } }
Highlight Selected ItemRenderer override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); if(ListBase(owner).isItemSelected(data)) { name_lbl.setStyle("styleName","pnameselected"); selected_img.visible = true; } else { name_lbl.setStyle("styleName","pname"); selected_img.visible = false; } }
Enable ItemRenderer to dispatch a remove person event
public static const DELETE_PERSON_EVENT:String = "deletePerson"; private function deleteClick_handler():void { var dEvt:Event = new Event(DELETE_PERSON_EVENT,true); this.dispatchEvent(dEvt); } This 'deletePerson' event is dispatched by the ItemRenderer and importantly has 'bubbles' set to true. This bubbling enables the parent component to simply add a listener for the event:
myDG.addEventListener(PersonItemRenderer.DELETE_PERSON_EVENT,deletePerson_handler); private function deletePerson_handler(evt:Event):void { if (myDG.selectedIndex != -1) peopleDataProvider.removeItemAt(myDG.selectedIndex); }
That's it for this example. The next example will build on this but go the route of a dynamic ItemRenderer, while they a little bit more complicated can be very flexible allowing for dynamic properties to be set on the itemRenderers.
Comments
Outstanding. Great job.
WOW! How did you figure all of this out? You saved me many hours, I'm sure, trying to get ADD & DELETE icons to display in a datagrid. Now I just have to study your example to figure out how to make the "click" transmit the row ID and trigger an AJAX call to the database.
Thank you for the example, the explanation and the source.
|
