在排序列表的数据提供者时,列出ItemRenderer重复

时间:2014-05-07 17:24:30

标签: flex flex3

标题基本上说明了我的问题。我正在为dataProvider排序列表。我在列表上有itemRenderers。 3个项目构建,opt1,opt2,opt3 - 然后我在列表上拖放,当完成后我等待我的自定义newRank变量在列表的dataProvider中设置。然后在对列表进行排序后,我的项目渲染器渲染出5个项目,而不是3个:opt2,opt3,opt1(前三个正确排序),opt3,opt3。 我试图使用基本排序和customFunction进行排序,但我无法正确排序。任何帮助,将不胜感激。

public function sortItemsByNewRank():void{
    var srt:Sort = new Sort();
    //srt.fields = [new SortField("newRank", true, false, true)];
    srt.compareFunction = myCompare;
    var ac:ArrayCollection = this.dataProvider as ArrayCollection;
    ac.sort = srt;
    ac.refresh();
}
private function myCompare(a:Object, b:Object, fields:Array = null):int {
    LOG.debug("ExtendedList a and b: "+a.newRank+"     "+b.newRank);
    if(a.newRank == b.newRank) {
        return 0;
    } else if(a.newRank > b.newRank) {
        return 1;
    } else{
        return -1;
    }
}

2 个答案:

答案 0 :(得分:0)

取一个[Bindable]变量并将其列入您的列表...... 在排序功能中使用该变量并调用刷新... 例如

[Bindable]
private var _dataProvider:ArrayCollection

public function sortItemsByNewRank():void{
    var srt:Sort = new Sort();
    //srt.fields = [new SortField("newRank", true, false, true)];
    srt.compareFunction = myCompare;
    _dataProvider.sort = srt;
    _dataProvider.refresh();
}

<s:List dataProvider="{_dataProvider}"/>

这可能会解决你的重复问题......

答案 1 :(得分:0)

我能解决这个问题。大多数问题都与我的排序运行时反复触发的DATA_CHANGE事件有关。我放了一面旗帜,它解决了我的问题。有点hacky,但invalidateList允许我清除并重新初始化数据到UI。