Looping over an ArrayCollection with Cursor Example
Line Break
Author: Arjan (36 Articles) - Author Website
Arjan is a SAP Consultant specialized in ABAP and Front End development techniques like Web Dynpro, Adobe Interactive Forms, Flex and AIR. In his free time he likes to create examples for Flex-Blog and other applications using Flex, AIR and PHP. Other hobbies are movies and music. He is also the co-owner of Flex-Blog.com.
There are different ways to loop over an ArrayCollection, the two approaches that are used to most are (I think) the folling two:
1 2 3 4 5 | // Assuming that I have a declared variable "ac" of type ArrayCollection which is not null for( var i:int=0; i<ac.length; i++ ) { //Do something here } |
and
1 2 3 4 | for each( var obj:Object in ac ) { //Do something here } |
Works fine of course, but if you are, for example, searching for something in the collection you still have to get the current item from the collection etc. etc. So is there a better way? Yes there is.
Until recently, I didn’t even know that the Flex ArrayCollection actually has a method that’s called createCursor(). Using this method you can create a cursor on you ArrayCollection that you can control by calling methods on the cursor Object.
Here’s how you create the cursor:
1 2 3 4 5 6 7 8 9 | import mx.collections.IViewCursor; [Bindable] private var cursor:IViewCursor; private function init():void { cursor=arrayCollection.createCursor(); } |
Once you have your cursor declared, you can use it to loop over your ArrayCollection like this:
1 2 3 4 5 6 7 | while(!cursor.afterLast) { // trace the name of the object the cursor is "on" at the moment // ( object must have a name attribute for this to work :) ) trace(cursor.current.name); cursor.moveNext(); } |
As you can see, you have immediate access to the current item and you don’t have to use something like arrayCollection.getItemAt(i) to access it!
Check out the following example to see some more methods that the cursor has (insert and remove). Use right-mouse->view source to see the source code.
Related posts:
- ArrayCollection Filter Example
- Set busy Cursor using the CursorManager
- Set custom cursor using the CursorManager
- Drag and Drop from DataGrid or AdvancedDataGrid to Tree
- Style AdvancedDataGrid depending on data example
Comments
3 Responses to “Looping over an ArrayCollection with Cursor Example”


(
Excellent! just what i was looking for, thanks
I have found a gotchya in this though, if you use “disableAutoUpdate” before entering the lopp, when removing items, the cursor does not get updated properly and you will exit the loop early.
I’m using a cursor to navigate in the datagrid rows.
My problem is that the datagrid has as itemrender the following
Now I need to catch for each row of the datagrid the selected value of the combobox when the user clicks on a button external to the datagrid.
How can I do this?
I have tryied with the cursor but how can I catch the combobox value?:
while( !cursor.afterLast )
{
// Access each column field like: cursor.current.MyFieldName
mx.controls.Alert.show(cursor.current.????)
// Obviously don’t forget to move to next row:
cursor.moveNext();
}
Hi Louis,
You have to specify the dataField of the DataGridColumn of the column in which you have the ComboBox itemrenderer behind the current object: cursor.current.[dataField value]
The current statement refers to the complete object in the original ArrayCollection, to get the value you should refer to the correct attribute from that object…
Hope this solves your problem.
- Arjan