Apache flex 将数据合并到过滤后的ArrayCollection(可能使用IViewCursor或localIndex?)

Apache flex 将数据合并到过滤后的ArrayCollection(可能使用IViewCursor或localIndex?),apache-flex,collections,flex4,flex4.5,arraycollection,Apache Flex,Collections,Flex4,Flex4.5,Arraycollection,我有一个灵活的问题,这并不像一开始看起来那么容易 至少一周以来我一直在挣扎 我准备了一个测试用例和一个屏幕截图 问题是:如何将数据(重复来自服务器)合并到过滤后的ArrayCollection中? 截图: TestCase.mxml(只需将其放入Flash Builder 4.6项目中): = 0; 我——){ 对于(j=data.length-1;j>=0;j--){ 如果(_data[i]==data[j]) 继续1; } _数据删除(i); } //2)将数据中出现的项目添加到_数据中

我有一个灵活的问题,这并不像一开始看起来那么容易

至少一周以来我一直在挣扎

我准备了一个测试用例和一个屏幕截图

问题是:如何将数据(重复来自服务器)合并到过滤后的ArrayCollection中?

截图:

TestCase.mxml(只需将其放入Flash Builder 4.6项目中):


= 0; 我——){
对于(j=data.length-1;j>=0;j--){
如果(_data[i]==data[j])
继续1;
}
_数据删除(i);
}
//2)将数据中出现的项目添加到_数据中
发现2:
对于(j=0;j
问题在于,当ArrayCollection\u数据被过滤时(因为复选框“偶数”被设置),那么测试用例中的第二个循环(用于添加新项目)会一次又一次地添加项目(“35”),因为它被过滤,因此不可见

请建议一个解决方案-与源代码

请不要给我发送像或这样的文档,因为我在过去一周已经读了很多


谢谢大家!

尝试按以下方式操作
ArrayCollection
属性:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Declarations>
        <s:RadioButtonGroup id="filterGroup" change="radioClicked(event)" />
    </fx:Declarations>

    <fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        private const DATA1:Array = [ 10, 20, 30, 40, 50 ];
        private const DATA2:Array = [ 10, 20, 30, 50 ];
        private const DATA3:Array = [ 10, 20, 30, 40, 50, 60 ];
        private const DATA4:Array = [ 10, 20, 30, 35, 40, 50 ];
        private const DATA5:Array = [];
        private const DATA6:Array = [ 25, 45 ];

        [Bindable]
        private var _data:ArrayCollection = new ArrayCollection();

        private function filterEven(item:Object):Boolean
        {
            var i:uint = item as uint;
            return (i % 2 == 0);
        }

        private function filterOdd(item:Object):Boolean
        {
            var i:uint = item as uint;
            return (i % 2 == 1);
        }

        private function merge(data:Array):void
        {
            var i:int;
            var j:int;


            var sourceData:Array = _data.source;
            // 1) remove items missing in data from _data
            found1: for (i = sourceData.length - 1; i >= 0; i--)
            {
                for (j = data.length - 1; j >= 0; j--)
                {
                    if (sourceData[i] == data[j])
                        continue found1;
                }
                var index:int = _data.getItemIndex(sourceData[i]);
                if (index > -1)
                    _data.removeItemAt(index); // remove visible items
                else
                    sourceData.splice(i, 1); // remove hidden (filtered) items
            }

            // 2) add items appeared in data to _data
            found2: for (j = 0; j < data.length; j++)
            {
                for (i = 0; i < sourceData.length; i++)
                {
                    if (sourceData[i] == data[j])
                        continue found2;
                }
                _data.addItem(data[j]);
            }
        }

        private function radioClicked(event:Event):void
        {
            switch (filterGroup.selection)
            {
                case allButton:
                {
                    _data.filterFunction = null;
                    break;
                }
                case oddButton:
                {
                    _data.filterFunction = filterOdd;
                    break;
                }
                case evenButton:
                {
                    _data.filterFunction = filterEven;
                    break;
                }
            }
            _data.refresh();
        }
    ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout gap="20" />
    </s:layout>

    <s:HGroup verticalAlign="baseline">
        <s:Label text="FILTER:" />
        <s:RadioButton id="allButton" group="{filterGroup}" label="All" selected="true" />
        <s:RadioButton id="oddButton" group="{filterGroup}" label="Odd" />
        <s:RadioButton id="evenButton" group="{filterGroup}" label="Even" />
    </s:HGroup>

    <s:List dataProvider="{_data}" id="_list" />

    <s:Button click="merge(DATA1)" id="_btn1" label="{DATA1.join()}" />
    <s:Button click="merge(DATA2)" id="_btn2" label="{DATA2.join()}" />
    <s:Button click="merge(DATA3)" id="_btn3" label="{DATA3.join()}" />
    <s:Button click="merge(DATA4)" id="_btn4" label="{DATA4.join()}" />
    <s:Button click="merge(DATA5)" id="_btn5" label="{DATA5.join()}" />
    <s:Button click="merge(DATA6)" id="_btn6" label="{DATA6.join()}" />

</s:Application>

= 0; 我——)
{
对于(j=data.length-1;j>=0;j--)
{
if(sourceData[i]==data[j])
继续1;
}
var-index:int=_data.getItemIndex(sourceData[i]);
如果(索引>-1)
_data.removitemat(index);//删除可见项
其他的
splice(i,1);//删除隐藏(过滤)项
}
//2)将数据中出现的项目添加到_数据中
found2:for(j=0;j
以及关于使用
RadioButton
RadioButtonGroup
的几点建议:

  • 不要使用单击事件来处理更改。这将禁用以其他方式管理按钮的可能性(例如,从键盘)。改用
    change
  • 如果您使用的是
    RadioButtonGroup
    ,最好参考
    group
    ,而不是
    groupName
    。它使您能够在编译时检查问题(想象一下组名中的一些打印错误)
  • 不要根据标签检查所选按钮。你们可以打印错误的标签名称,或者你们可以更改标签等等,而编译器在这方面帮不了你们

回答得很好,谢谢。我只是想知道,即使对于存储在ArrayCollection中的更复杂的对象,getItemIndex()是否始终有效?只要ActionScript操作指向这些对象的指针,指向同一实例的所有指针都是相等的。而
ArrayCollection
只是将指针与
getItemIndex()
中复杂类型的实例进行比较。所以它对复杂对象很有效。所以如果我在我的真实应用程序中有ArrayCollection的XML对象,并且需要比较和
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">

    <fx:Declarations>
        <s:RadioButtonGroup id="filterGroup" change="radioClicked(event)" />
    </fx:Declarations>

    <fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;

        private const DATA1:Array = [ 10, 20, 30, 40, 50 ];
        private const DATA2:Array = [ 10, 20, 30, 50 ];
        private const DATA3:Array = [ 10, 20, 30, 40, 50, 60 ];
        private const DATA4:Array = [ 10, 20, 30, 35, 40, 50 ];
        private const DATA5:Array = [];
        private const DATA6:Array = [ 25, 45 ];

        [Bindable]
        private var _data:ArrayCollection = new ArrayCollection();

        private function filterEven(item:Object):Boolean
        {
            var i:uint = item as uint;
            return (i % 2 == 0);
        }

        private function filterOdd(item:Object):Boolean
        {
            var i:uint = item as uint;
            return (i % 2 == 1);
        }

        private function merge(data:Array):void
        {
            var i:int;
            var j:int;


            var sourceData:Array = _data.source;
            // 1) remove items missing in data from _data
            found1: for (i = sourceData.length - 1; i >= 0; i--)
            {
                for (j = data.length - 1; j >= 0; j--)
                {
                    if (sourceData[i] == data[j])
                        continue found1;
                }
                var index:int = _data.getItemIndex(sourceData[i]);
                if (index > -1)
                    _data.removeItemAt(index); // remove visible items
                else
                    sourceData.splice(i, 1); // remove hidden (filtered) items
            }

            // 2) add items appeared in data to _data
            found2: for (j = 0; j < data.length; j++)
            {
                for (i = 0; i < sourceData.length; i++)
                {
                    if (sourceData[i] == data[j])
                        continue found2;
                }
                _data.addItem(data[j]);
            }
        }

        private function radioClicked(event:Event):void
        {
            switch (filterGroup.selection)
            {
                case allButton:
                {
                    _data.filterFunction = null;
                    break;
                }
                case oddButton:
                {
                    _data.filterFunction = filterOdd;
                    break;
                }
                case evenButton:
                {
                    _data.filterFunction = filterEven;
                    break;
                }
            }
            _data.refresh();
        }
    ]]>
    </fx:Script>

    <s:layout>
        <s:VerticalLayout gap="20" />
    </s:layout>

    <s:HGroup verticalAlign="baseline">
        <s:Label text="FILTER:" />
        <s:RadioButton id="allButton" group="{filterGroup}" label="All" selected="true" />
        <s:RadioButton id="oddButton" group="{filterGroup}" label="Odd" />
        <s:RadioButton id="evenButton" group="{filterGroup}" label="Even" />
    </s:HGroup>

    <s:List dataProvider="{_data}" id="_list" />

    <s:Button click="merge(DATA1)" id="_btn1" label="{DATA1.join()}" />
    <s:Button click="merge(DATA2)" id="_btn2" label="{DATA2.join()}" />
    <s:Button click="merge(DATA3)" id="_btn3" label="{DATA3.join()}" />
    <s:Button click="merge(DATA4)" id="_btn4" label="{DATA4.join()}" />
    <s:Button click="merge(DATA5)" id="_btn5" label="{DATA5.join()}" />
    <s:Button click="merge(DATA6)" id="_btn6" label="{DATA6.join()}" />

</s:Application>