A DataGrid with a Custom ItemRenderer
Hi all,
I have a DataGrid whose DataProvider is bound to a simple Array. I have a custom ItemRenderer that includes a button that can remove the item itself (I don't want two separate columns with a remove button in one of them). However, I don't understand the behaviour - clicking the button rearranges the data in the DataGrid and sometimes duplicate the entries! See the example attached. Any idea what's happening?
Martin.
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="onCreationComplete();" xmlns:local="*">
<mx:Script>
<![CDATA[
[Bindable]
public var _data : Array;
protected function onCreationComplete() : void {
_data = new Array();
_data.push(1, 2, 3, 4, 5);
]]>
</mx:Script>
<mx:VBox>
<mx:DataGrid dataProvider="{_data}">
<mx:columns>
<mx:DataGridColumn>
<mx:itemRenderer>
<mx:Component>
<mx:HBox implements="mx.controls.listClasses.IDropInListItemRenderer" creationComplete="dataLabel.text = String(data);">
<mx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.controls.DataGrid;
import mx.controls.listClasses.BaseListData;
protected var _listData : BaseListData;
public function get listData() : BaseListData {
return _listData;
public function set listData(d : BaseListData) : void {
_listData = d;
protected function onClick(e : Event) : void {
var dp : ArrayCollection = (owner as DataGrid).dataProvider as ArrayCollection;
dp.removeItemAt(listData.rowIndex);
]]>
</mx:Script>
<mx:Label id="dataLabel" width="100%" />
<mx:Button click="onClick(event);"/>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>
</mx:VBox>
</mx:Application>
creationComplete is rarely used in renderers. See the itemrenderer posts on my blog
Alex Harui
Flex SDK Developer
Adobe Systems Inc.
Blog: http://blogs.adobe.com/aharui
Similar Messages
-
DataGrid with TextArea in itemRenderer using drag and drop
I have a DataGrid and in one of the columns I am using an itemRenderer, in this itemRenderer I have a spark textArea, with this textArea I am have scrolling enabled. Also with this dataGrid I have drag enabled (for drag/drop).
I am seeing two problems if anyone has any suggestions:
1. When you try to scroll the textArea, dragging kicks in, so you get partial scrolling then dragging.
2. Using the up/down symbols of the scroller, the scrollbar moves but the text in the dataGrid cell does not.
Thanks,
John
This is the itemRenderer:
?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo"
implements="mx.controls.listClasses.IDropInListItemRenderer">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.controls.dataGridClasses.DataGridListData;
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.conversion.TextConverter;
private var _listData:BaseListData;
[Bindable]
private var thisTextFlow:TextFlow;
public function get listData():BaseListData
return _listData;
public function set listData(value:BaseListData):void
_listData = value;
override public function set data(value:Object):void
if (value != null)
super.data = value;
thisTextFlow = TextConverter.importToFlow(data[(listData as DataGridListData).dataField], TextConverter.TEXT_FIELD_HTML_FORMAT);
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
]]>
</fx:Script>
<s:TextArea id="textArea" textFlow="{thisTextFlow}"
editable="false" borderVisible="false"
width="100%"
contentBackgroundAlpha="0"
heightInLines="4"
verticalScrollPolicy="auto" horizontalScrollPolicy="auto"/>
</mx:VBox>Below is code that is working and is re-usable, and if a textArea has a visible scrollbar than when that scrollbar has mouse down/up it sets the dataGrid to dragEnable = false/true to take care of the problem with the textArea dragging and scrolling at the same time.
One minor thought/issue is:
1. The size of this renderer using both a VBox and a textArea - but I wanted a scrollable text area that handles textflow.
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo"
implements="mx.controls.listClasses.IDropInListItemRenderer"
creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.controls.DataGrid;
import mx.events.FlexEvent;
import mx.controls.dataGridClasses.DataGridListData;
import mx.controls.listClasses.BaseListData;
import mx.controls.listClasses.IDropInListItemRenderer;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.conversion.TextConverter;
private var dg:DataGrid;
private var _listData:BaseListData;
[Bindable]
private var thisTextFlow:TextFlow;
private function init():void
dg = DataGrid(_listData.owner);
textArea.scroller.verticalScrollBar.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown_handler);
textArea.scroller.horizontalScrollBar.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown_handler);
private function mouseDown_handler(event:MouseEvent):void
dg.dragEnabled = false;
textArea.scroller.verticalScrollBar.addEventListener(MouseEvent.MOUSE_UP, mouseUp_handler);
textArea.scroller.horizontalScrollBar.addEventListener(MouseEvent.MOUSE_UP, mouseUp_handler);
private function mouseUp_handler(event:MouseEvent):void
dg.dragEnabled = true;
textArea.scroller.verticalScrollBar.removeEventListener(MouseEvent.MOUSE_UP, mouseUp_handler);
textArea.scroller.horizontalScrollBar.removeEventListener(MouseEvent.MOUSE_UP, mouseUp_handler);
public function get listData():BaseListData
return _listData;
public function set listData(value:BaseListData):void
_listData = value;
override public function set data(value:Object):void
if (value != null)
super.data = value;
thisTextFlow = TextConverter.importToFlow(data[(listData as DataGridListData).dataField], TextConverter.TEXT_FIELD_HTML_FORMAT);
dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
]]>
</fx:Script>
<s:TextArea id="textArea" textFlow="{thisTextFlow}"
editable="false" borderVisible="false"
width="100%"
contentBackgroundAlpha="0"
heightInLines="4"/>
</mx:VBox> -
Drag single object from datagrid with customitemrenderer to new datagrid
Hi there,
If searched the internet for this solution but could not find it (maybe searching on the wrong searchwords..)
I have a datagrid with a custom itemrenderer. It shows the product, some product specs and the price/package amount.
The price per package is shown 4 times as pricelabels. Like 30pcs for 20 euro, 60, pieces for 35 euro etc...
Normal dragging and dropping works like a charm but I dont want my row dragabble but the 4 price labels in the row. Drag one of them to the new datagrid.
Is this possible?
ThanxSomething related to it,
http://www.mechansp.com/prod_mecgrid.php#dragdrop -
How do I make a Custom DataTip with Custom ItemRenderer
I can't seem to find any documentation or examples of
displaying a dataTip (similar to those used with charting) with my
custom itemRenderer (mxml component). This is for use in a
dataGridColumn. I Could someone give me an example? The closest
I've been able to find is
http://www.mail-archive.com/[email protected]/msg61624.html,
which doesn't say how to do it.
Thanks!http://blog.bigfatstogie.com/?p=42
run the example towards the end of the page -
Datagrid with textfield problem
Hello,
I have a datagrid with a custom cellrenderer that renders the datagrid column as a textfield. This works fine, but when I scroll the datagrid up and down, the text in the text field gets all jumbled. I have attached an image showing before and after scrolling. I am assuming that I need to redraw the datagrid after the scrollbar loses focus or something like that, but I am new to AS3 and unsure how to proceed. Any help greatly appreciated!The phone can deal with that. It's just how the input system of most phones work: a sentence starts with a captical letter. you can simply turn that of, just as you would so if you were writing an sms. See your phones manual for that!
-
TileList bulk image display / custom itemRenderer problem
I create a tilelist with a custom itemRenderer which will display image loaded with some text description, the source is from XML.
the image displayed correctly from 1 - 10 itemrenderer.
The problem happens on the itemrenderer 10+, the image is mismatch with the text description.
The worse thing is when I scroll the tilelist, the image change row by row that does not match with the text.
Why ? Any solution for thisDear Alex
Many thanks for your hint. It did solve the problem
My orginal code make a dirty flag at commitProperties() that image load only once at first time. After your hint, I remove the loading code out and the problem has been solved. Thanks
However performance wise, the image blind and reload whenever I scoll the tilelist, how can I
a/ make the scrolling process more smoothly
b/ the image still in the screen ( no blind and off ) whenever I scroll the tilelist
Thanks and hope to hear your hint again -
Hi again, developers:
I'm in a search of a datagrid with certain characteristics:
- variableRowHeight = "true"
- only one column
- each row must have a custom item renderer with possibly different heights, and a fixed width
- the datagrid must show always every item in the data provider with no vertical scroll bars, what means that the datagrid height must have always the exact height sum of all the item renderers it is displaying.
- and no extra empty rows must appear in the last positions of the datagrid
The last two requirements are something difficult to achieve... for some reason, empty rows appear at the last positions of the datagrid. I post what i've managed to get:
<mx:Script>
<![CDATA[
private function resize():void
if (dg.dataProvider)
var h:Number = dg.measureHeightOfItems( -1, dg.dataProvider.length);
dg.height = h;
]]>
</mx:Script>
<mx:DataGrid id="dg" width="530" horizontalCenter="0" verticalScrollPolicy="off"
dataProvider="{dp}"
wordWrap="true" variableRowHeight="true" showHeaders="false" dataChange="resize()" height="{dg.measureHeightOfItems(-1,dg.dataProvider.length)}" click="Alert.show(dg.rowCount.toString());">
<mx:columns>
<mx:DataGridColumn headerText="ID" width="50">
<mx:itemRenderer>
<mx:Component>
<mx:TextArea height="{Math.random()*100}" wordWrap="true" backgroundColor="{Math.random() * 16777216}" paddingTop="0" paddingBottom="0"/>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
</mx:columns>
</mx:DataGrid>Thanks Harui, but it doesn't help. If the border is set it will help, but the very big problem is the empty rows that appear at the end of the datagrid... I can't find a way of measuring correctly the height of the itemRenderers!
I'll update this thread if I manage to do it. -
Setting a DataProvider to a custom itemRenderer in a DataGrid
Hi,
I've got a DataGrid, with one column using a custom AS itemRenderer to display a ComboBox. Everything works, but there are various "wierd" behaviors occuring (when I remove a row, the ComboBox of the next row in line resets to it's label, but none of the others do... When I add a row, various apparently random comboboxes change their selectedItem, etc...)
Anyways, I had some luck isolating each of these individual bugs and squashing them, but each time I do, others seem to pop up. I suspect the main issue is the way I'm setting the ComboBox's dataProvider. The dataProvider is dynamic - an XML file generated from a MySQL table using PHP. Knowing no other way to do so, I'm overriding the set data method and explicitly setting it there, like so:
override public function set data(value:Object):void{
super.data = value;
dataProvider = value.uom; // value.uom is the XML
Is there a better way to set the data provider - an approach where I can set it once and therefor avoid the override entirely? Again, the itemRenderer is an ActionScript class, and not implemented with XML...
<mx:DataGridColumn itemRenderer="renderers.UOMBox" dataField="uom" headerText="UOM" />
and...
package renderers{
public class UOMBox extends ComboBox{
... etc ...
Thanks in advance.How does this code work for you:
override public function set data(value:Object):void{
if(value != null) {
super.data = value;
dataProvider = value.uom; // value.uom is the XML
super.invalidateDisplayList();
The missing invalidateDisplayList in your code might be what will help with your problems.
Chris -
How To Update Custom ItemRenderer (Image) on DataGrid Edit
I have an DataGrid with 2 columns, column 1 called "Name" and column 2 called "Actions".
The "Name" column contains editable text and the "Actions" column uses a (inline) custom ItemRenderer which displays 2 icon images ( for Edit and Delete). All works fine. Clicking Edit or Delete calls the corrosponding outerDocument method.
The feature I am trying to add is as follows: when someone double-clicks on the text in the Name column to edit it, I would like the edit icon in the Actions column to ( grow/shrink, change color - or some such indication/reminder to click it ). Not seeing how to do this with the inline ItemRenderer, I created a custom item renderer class and, in that class, use mx:Resize to perform the "grow/shrink". I created a method called "pulse()" and, from within that renderer, all works well. ( for testing, I wired the icons click event to the pulse() method ). However, now I am not sure how to call that ItemRenderers "pulse()" method to perform the effect from the main DataGrid (when the user double-clicks on Name field to edit).
The tried using the DataGrid's "itemEditBegin", which fires correctly, but from that point I am not sure how to access the selected rows edit icon in the "Action" column. ( to call its pulse() ) method.
So any suggestions how I can achieve my end result? Being able to manipulate the edit icon in the "Actions" column, when the user double-clicks (edits) that row's "Name" column?
If I'm going about it all wrong, feel free to offer alternative solutions.
Any help would be appreciated.
Thanks,
~eHi,
Check the BAPI_MATERIAL_SAVEDATA ,in the BAPI is there a table parameter EXTENSIONIN ?
which you can use to pass the values for user defined fields to the BAPI..
Regards
Kiran Sure -
DataGrid tooltip doesn't work for customized itemRenderer
I have a DataGrid with one column is a customized renderer,
when I try to use the dataTripFunc, it is not showing tooltips,
same function works for the other non-customized column, here is
the code:
<mx:DataGrid id="myDataGrid" dataProvider="{dataContent}"
width="100%" height="100%">
<mx:columns>
<mx:DataGridColumn dataField="name" headerText=""/>
<mx:DataGridColumn dataField="DateTime"
headerText="DateTime" showDataTips="true"
dataTipFunction="cellDataTipFunc"/>
<mx:DataGridColumn dataField="ImgBar" headerText="ImgBar"
itemRenderer="ImgBarCell" minWidth="40" showDataTips="true"
dataTipFunction="cellDataTipFunc"/>
</mx:columns>
</mx:DataGrid>
public function cellDataTipFunc(item:Object):String {
return "hello world";
Where the itemRenderer -- "ImgBarCell" is a customized HBox
component with a label and image on it.
The tooltip -- "helloworld" shows up for column "DateTime",
but not for customized ImgBar.
Does this one have anything to do with event generation for
customized itemRenderer? Or a bug in flex2?Hi
The TREX server (service) must started and be contactable by RFC - this can be checked by carrying out the actions listed above. (Refer OSS Note - 866547 Error when accessing TREX server for more details )
<b>Please have a look at the following SAP OSS Note, which will help -></b>
Note 851106 - Search in catalog from SRM leads to "Service not reachable"
<u>Other related OSS Notes</u>
Note 973594 Cross Catalog Search - Configuration
Note 894717 Items from Cross Catalogs Result does not appears in step 2
Note 803731 Cross-category search returns no result
Note 847137 OCI, cross-catalog search: detail display
Note 996885 Cross Catalog Search - Timeout while accessing MDM Catalog
1023487 cross-catalog-serach in portal opens up a duplicate window
1020025 Item detail display in Cross Catalog Search
1027352 Item detail display in Cross Catalog Search
Note 866547 - Error when accessing TREX server
Note 988427 - Update to TREX 6.1 Rev 27
Note 994623 - Hierarchy Buffer and BIA
Note 1030056 - Improvement in the Search within Results feature of CSE
Note 798988 CCM/CSE: Sorting sometimes returns no results
Note 778688 TREX_INDEX_MANAGER unit test update_view(): incorrect search
Note 808754 Display sequence of the characteristics is not changeable
Note 794325 - Error in OCI transfer in the BAdI /CCM/OCI_SCALEPRI
Note 745235 Search ability changes to cross-catalog characteristics
Note 724097 - Search of the comp. in case of structured characteristics
Note 743643 Search ability change in cross-catalog characteristics
Note 847551 Displaying date, time, and timestamp in the CSE
Note 750756 Program for the deletion/clean up of TREX indexes
Do update me as well.
Regards
- Atul -
DataGrid with Custom Component not showing sub-components
I'm hoping someone can enlighten me on this issue.
I have a datagrid with one column which has an item renderer. It doesn't matter if the "text" data comes from a dataProvider or is static.
If I do the following, only the first label will show up.
<mx:DataGridColumn headerText="Column Title">
<mx:itemRenderer>
<mx:Component>
<mx:VBox>
<mx:Label text="{data.data1}" />
<mx:Label text="{data.data2}" />
</mx:VBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
However, if I change the VBox to a HBox both labels will show up.
<mx:DataGridColumn headerText="Column Title">
<mx:itemRenderer>
<mx:Component>
<mx:HBox>
<mx:Label text="{data.data1}" />
<mx:Label text="{data.data2}" />
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
I'm using:
Flex Builder 3 Standalone
Version: 3.0.214193
OS: Vista
Any ideas or comments would be appreciated.Thanks for the reply KomputerMan.com. I've tried changing the dimensions of the VBox and no other labels appeared. Usually, when there is not enough room within the datagrid cell scrollbars will appear - you can experiment with the example below to see what I mean.
As for radiobuttons in a datagrid, here you go. The DataGrid and its dataProvider are constructed in the same way you normally would.
<mx:DataGridColumn headerText="Approve/Deny/Pending" width="170">
<mx:itemRenderer>
<mx:Component>
<mx:HBox height="27" paddingLeft="10">
<mx:Script>
<![CDATA[
private function isSelected(s:Object, val:String):Boolean {
if ( s.toString() == val) {
return true;
} else {
return false;
]]>
</mx:Script>
<mx:RadioButton groupName="approveType"
id="approved"
label="A"
width="33"
click="data.status='1'"
selected="{isSelected(data.status, '1')}"/>
<mx:RadioButton groupName="approveType"
id="denied"
label="D"
width="33"
click="data.status='2'"
selected="{isSelected(data.status, '2')}/>
<mx:RadioButton groupName="approveType"
id="Pending"
label="P"
width="33"
click="data.status='3'"
selected="{isSelected(data.status, '3')}/>
</mx:HBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn> -
ComboBox with custom ItemRenderer
This is my combobox where I am trying to have a custom renderer:
<?xml version="1.0" encoding="utf-8"?>
<mx:ComboBox xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/halo">
<fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.collections.ArrayCollection;
import mx.controls.CheckBox;
public var datas:XML;
[Bindable]
var ItemRenderer:ClassFactory;
override public function set data(value:Object):void
dataProvider = datas["sku" + value.sku];
ItemRenderer = new ClassFactory(comboBoxCheckBoxItemRenderer);
itemRenderer = ItemRenderer;
public function saveCheckState(evt:Event):void
var dataProviderItem:Object = dataProvider.getItemAt(dataProvider.getItemIndex(selectedItem));
dataProviderItem.selected = CheckBox(evt.currentTarget).selected;
dataProvider.setItemAt(dataProviderItem, dataProvider.getItemIndex(selectedItem));
]]>
</fx:Script>
</mx:ComboBox>
This combobox is used as a custom itemrenderer in datagrid.
Here is code for comboBoxCheckBoxItemRenderer:
package modulecode
import mx.containers.HBox;
import mx.controls.CheckBox;
import mx.controls.Label;
import mx.controls.Spacer;
public class comboBoxCheckBoxItemRenderer extends HBox
private var action:Label;
private var spacer:Spacer;
private var checkBox:CheckBox;
public function comboBoxCheckBoxItemRenderer()
super();
override protected function createChildren():void {
// Call the createChildren() method of the superclass.
super.createChildren();
action = new Label();
// Add the child component to the custom component.
addChild(action);
spacer = new Spacer();
spacer.percentWidth = 100;
// Add the child component to the custom component.
addChild(spacer);
checkBox = new CheckBox();
// Add the child component to the custom component.
addChild(checkBox);
override public function set data(value:Object):void
action.text = value.action;
checkBox.selected = value.selected;
What's happening is that nothing is happening untill I drop combobox down in the grids. As the result checkboxes are not selected properly.
Any help?How would I set up a custom itemrenderer to use data binding but properly have selected property in the following code:
<<mx:itemRenderer>
<fx:Component>
<mx:HBox width="100%">
<mx:Label text="{XML(data).action}"/>
<mx:Spacer width="100%"/>
<mx:CheckBox id="check" selected="{XML(data).selected}"
change="outerDocument.saveCheckState(event);"/>
</mx:HBox>
</fx:Component>
</mx:itemRenderer> -
DataGrid: custom ItemRenderer changes Header renderer
If I assign custom ItemRenderer to a DataGrid, this also affects headers, i.e. headers start looking as the fields in a grid. Not only that, but it seems that render is much worse and it really looks bad. Is this how it's supposed to be, is there a workaround to keep the headers as they should be and just change the actual renderers in the grid?
Post a bit of your code.
Sincerely,
Michael
Sent from my iPhone
El 16/07/2009, a las 23:24, mraak <[email protected]> escribió:
>
If I assign custom ItemRenderer to a DataGrid, this also affects
headers, i.e. headers start looking as the fields in a grid. Not
only that, but it seems that render is much worse and it really
looks bad. Is this how it's supposed to be, is there a workaround to
keep the headers as they should be and just change the actual
renderers in the grid?
> -
Items in Tree control move around when data is submitted using custom ItemRenderer
I'm working on a Tree control with an XMLListCollection as
its dataProvider.
The dataProvider has information looking like this :
quote:
<?xml version='1.0' encoding='utf-8'?>
<INFO>
<FIELD label="STR_USER_NAME"
type="text"
value=""
>
</FIELD>
<FIELD label="STR_USER_EMAIL"
type="text"
value=""
>
</FIELD>
<FIELD label="STR_OPTIONAL"
type="branch"
value="0"
>
<FIELD label="STR_USER_ADDRESS"
type="text"
value=""
>
</FIELD>
<FIELD label="STR_USER_POSTAL_CODE"
type="text"
value=""
>
</FIELD>
</FIELD>
</INFO>
So in the Tree control I'd like the information to show up
with a label and
an
editable textbox for each item :
[Label] [textbox]
To do this I made a tree like this :
quote:
<mx:Tree id="userTree"
editable="true"
rendererIsEditor="true"
editorDataField="curVal"
itemRenderer="{new ClassFactory(ItemRendererUser)}"
itemEditEnd="e_ProcessData(event);"
dataDescriptor="{new DataDescriptorUsers()}"
showRoot="false"
verticalScrollPolicy="{ScrollPolicy.AUTO}"
/>
where the e_ProcessData() function looks like this (I used
http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/js/html/wwhelp.htm?href=c
elleditor_073_16.html#202105 as a guide) :
quote:
public function e_ProcessData(event:ListEvent):void
event.preventDefault();
userTree.editedItemRenderer.data.@value =
ItemRendererUsers(event.currentTarget.itemEditorInstance).curVal;
userTree.destroyItemEditor();
userTree.dataProvider.notifyItemUpdate(userTree.editedItemRenderer);
} // END OF e_ProcessData()
I attached the rest of the files because they're a little
bit longer.
When I run the program, the data shows up fine when it is
initialized the
very
first time, and I made a test button that just dumps the
contents of the
dataProvider in a trace statement to verify that the data has
been set
properly.
The problem I've run into is whenever the textfield is
edited, the item
that
I've selected jumps around the list.
For example, if I edit the item "STR_USER_NAME" after I
finish the edit, it
will move from the very first position in the Tree to the
bottom of the
Tree.
I traced the contents of the dataProvider and the
dataProvider structure
stays
the same, with the "STR_USER_NAME" at the top, but if I look
at the flex app
in
the web browser, its position is at the bottom of the Tree.
This happens for every other item I try to edit... I read in
the
documentation
that the ItemRenderers are recycled, so it means I should be
checking to
make
sure the initial states are covered, but I'm not sure how
this affects my
application.
Can anyone help me out with this ? Its very confusing - I've
tried making
an
ItemRenderer using pure actionscript, mxml and the
combination you see in
this
example and I always end up with the same behaviour - So I
must be missing
something critical...
// ItemRendererUsers.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="
http://www.adobe.com/2006/mxml"
verticalScrollPolicy="{ScrollPolicy.OFF}"
horizontalScrollPolicy="{ScrollPolicy.OFF}"
creationComplete="initItemRendererUsers();"
>
From my FAQ:
Q: I've created a custom itemRenderer component to use in a
List
based component (Datagrid, TileList, HorizontalList, etc.).
When my List
first displays, everything looks fine, but when I scroll it
or change the
dataProvider, some of the itemRenderers show values or
formatting that
aren't right. How do I fix this?
A: List-based components don't draw a renderer for every item
in the
dataProvider. Instead, they create enough to display what is
on screen now,
plus one or two more waiting in the wings. This means they
recycle the
renderers rather than creating new ones when you change
dataProvider or
scroll up and down. When you use a creationComplete event to
set up the
itemRenderer, that event doesn't happen again when the
renderer is used for
a different set of data. The solution to this is to override
the set data
protected function that most components have.
For more information, check out the following resources:
http://www.adobe.com/devnet/flex/articles/itemrenderers_pt1.html?devcon=f1
http://blogs.adobe.com/aharui/2007/03/thinking_about_item_renderers_1.html
Please note, I post this FAQ weekly, and you can find a
permanent copy of it
here
http://www.magnoliamultimedia.com/flex_examples/Amys_Flex_FAQ.pdf"peterh8234" <[email protected]> wrote in
message
news:gaqttd$kft$[email protected]..
> Yes - the set and get functions are listed down below.
But the quirky
> behaviour
> is the same regardless of whether I override the set and
get functions or
> not.
>
> I noticed there was another variable called listData -
should I be using
> that
> one or the data variable to read and write to the
dataProvider ?
>
> // _data
> [Bindable] public var _data:Object;
> [Bindable("dataChange")]
> //
> override public function get data():Object
> {
> trace('[ItemRendererDefault.GET data()] called for {' +
> _data.attribute("label") + '}.');
> return _data;
> } // END OF get data()
>
> //
> override public function set data(value:Object):void
> {
> _data.@value = inputText.text;
> trace('[ItemRendererDefault.SET data()] called for {' +
> _data.attribute("label") + '}.');
>
> invalidateProperties();
> } // END OF set data()
Your set data needs to set a flag that gets picked up in
commitProperties()
and does your thing that you were doing before in
creationComplete. You
should see examples of this in the links I posted. Instead of
this:
_data.@value = inputText.text;
you should look at implementing IDropInListItemRenderer,
which will allow
you to dynamically determine which field to look at, instead
of hardcoding
it. You also might wind up overwriting the stored value with
a null value
when the List passes the stored value in. I'd encourage you
to really go
through those links I posted and make sure you understand
what they're
saying. The itemRenderer life cycle is one of the hardest
things to
understand, but once you understand it, it makes many things
in Flex much
easier. It's worth investing the time. -
Forcing custom itemRenderer to updateDisplayList?
Hi, I'm new to flex, and was having some trouble.
In my project, I have a DataGrid, and a
BarChart->BarSeries. The DataGrid and the BarSeries share the
same DataProvider. I've made a custom itemRenderer, so that I can
click on Bars in the BarSeries and have them be highlighted in
black. This is done by having the itemRenderer listen for a CLICK
event, changing a variable that stores what color I want, then
calling invalidateDisplayList() to have updateDisplayList update
the display.
Since DataGrid and BarSeries share the same DataProvider,
elements in the DataGrid match up with elements in the BarSeries.
Therefore, I would like to be able to have a user click on an item
in the DataGrid, and have the associated bar in the BarSeries chart
become highlighted. However, I can't find a way to get the
itemRenderer to call updateDisplayList from outside of the
itemRenderer itself. I thought that calling invalidateDisplayList()
using the BarChart's id or the BarSeries id would force the
itemRenderer for the BarSeries to call updateDisplayList() and
update itself, but by using the debug feature, I have found that it
does not do this. Does anyone have any advice for how I would be
able to click on a DataGrid item and have it highlight the
corresponding item in the BarChart?
Thanks!Hi, I'm new to flex, and was having some trouble.
In my project, I have a DataGrid, and a
BarChart->BarSeries. The DataGrid and the BarSeries share the
same DataProvider. I've made a custom itemRenderer, so that I can
click on Bars in the BarSeries and have them be highlighted in
black. This is done by having the itemRenderer listen for a CLICK
event, changing a variable that stores what color I want, then
calling invalidateDisplayList() to have updateDisplayList update
the display.
Since DataGrid and BarSeries share the same DataProvider,
elements in the DataGrid match up with elements in the BarSeries.
Therefore, I would like to be able to have a user click on an item
in the DataGrid, and have the associated bar in the BarSeries chart
become highlighted. However, I can't find a way to get the
itemRenderer to call updateDisplayList from outside of the
itemRenderer itself. I thought that calling invalidateDisplayList()
using the BarChart's id or the BarSeries id would force the
itemRenderer for the BarSeries to call updateDisplayList() and
update itself, but by using the debug feature, I have found that it
does not do this. Does anyone have any advice for how I would be
able to click on a DataGrid item and have it highlight the
corresponding item in the BarChart?
Thanks!
Maybe you are looking for
-
Each time I try to sync I get the same error message. Each time I authorize my computer. And each time I get a reply that my computer is already authorized. I cannot get this to sync.Any ideas?
-
Would anybody know if a PDF file can be imported into an excel spreadsheet? if so HOW?
-
10.6.8 to mountain lion not working?
I have been using mac os x 10.5.8 and I decided that it was time for me to get the newest version. So the first thing i did was buy the 10.6.8 and downloaded it on my computer. I went on the app store to purchase the 10.8, but it said not compatible?
-
How to I hook my phone to my XP based computer and get my pictures and videos
I am trying to get my videos and pictures off my LG Spectrum onto my computer. I hooked it up using the cable but I don't think I have the correct drivers or what ever to get the files off my phone and onto my computer.
-
One picture in more Color label set?
It's possible to have more "label text" on one picture? I have more "color label set" (category, portfolio, web....) but I can't join the same picture to more color label set. How do you use label set?