This looks like a bug in the ListCollectionView.as file. If you'd like, you can 
monkey patch this code to work.

The bug is at line 529:
this.addItemAt(addList.getItemAt(i), i+index);

should be:
list.addItemAt(addList.getItemAt(i), i+index);

I figured this out from the addItemAt function.

If you don't know how to monkey patch Flex code, this is how I did it:
-Find out the package directory from the package line (In this case 
mx.collections).
-Create the directories as per this line (In this case create a directory mx in 
your src directory. In this directory create a directory named collections).
-Inside the directory create an ActionScript file with the same name as the 
file you are monkey patching (In this case ListCollectionView.as).
-Copy and paste all the code from the original file into this new file.
-Change this new file as you see fit. When Flex compiles your code will be 
included instead of the framework code.

You should file a bug with the fix.

--- In flexcoders@yahoogroups.com, "johncch85" <john...@...> wrote:
>
> I understand that ArrayCollection.addAll was added in flex sdk 3.4. I'm 
> coding a simple application and I'm hitting this problem. I would like to ask 
> if anyone knows what's happening:
> 
> Here's the source, just a simple mxml:
> 
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; 
> creationComplete="creationComplete()">
>       <mx:Script>
>               <![CDATA[
> import mx.collections.ArrayCollection;
>               private var a:Array = [
>                       { key: "a", value: "b" },
>                       { key: "a", value: "b" },
>                       { key: "a", value: "x" },
>                       { key: "a", value: "b" }
>               ];
>               
>               private var b:Array = [
>                       { key: "b", value: "c" },
>                       { key: "b", value: "x" },
>                       { key: "b", value: "c" },
>                       { key: "b", value: "c" }
>               ];
>               
>               private var c:Array = [
>                       { key: "d", value: "x" },
>                       { key: "d", value: "e" },
>                       { key: "d", value: "e" },
>                       { key: "d", value: "e" }
>               ];
>               
>               [Bindable] public var xx:ArrayCollection = new 
> ArrayCollection();
>               
>               public function creationComplete():void {
>                       var i:int;
>                       xx.filterFunction = filter;
>                       xx.addAll(new ArrayCollection(a));
>                       /*for (i = 0; i < a.length; i++) {
>                               xx.addItem(a[i]);
>                       }*/
>                       trace("Refresh is " + xx.refresh());
>                       xx.addAll(new ArrayCollection(b));
>                       /*for (i = 0; i < b.length; i++) {
>                               xx.addItem(b[i]);
>                       }*/
>                       trace("Refresh is " + xx.refresh());
>                       xx.addAll(new ArrayCollection(c));
>                       /*for (i = 0; i < c.length; i++) {
>                               xx.addItem(c[i]);
>                       }*/
>                       trace("Refresh is " + xx.refresh());
>               }
>                       
>               private function filter(item:*):Boolean {
>                       if (item.value == "x") return false;
>                       return true;
>               }
>                       
>               ]]>
>       </mx:Script>
>       <mx:DataGrid id="dg" dataProvider="{xx}"></mx:DataGrid>
> </mx:Application>
> 
> When I compile and run I get:
> 
> RangeError: Index '5' specified is out of bounds.
> 
> What I'm doing basically is to add some random array of objects into an 
> ArrayCollection binded to the DataGrid. And because there is a filter 
> function associated with the ArrayCollection, I call refresh() every time 
> something is added. The original use case is that this is like a drop object 
> method for the datagrid, so it's possible for it to be called multiple times.
> 
> I'm just curious why is this happening. Is this the desired behaviour? I'll 
> look into the source code later when I'm free, but this is just to get a 
> general feeling of the problem.
>


Reply via email to