Apache flex 对列表的数据提供程序进行排序时,列表项呈现程序重复

Apache flex 对列表的数据提供程序进行排序时,列表项呈现程序重复,apache-flex,flex3,Apache Flex,Flex3,标题基本上说明了我的问题。我正在对数据提供程序进行排序以获取列表。我的列表上有ItemRenders。生成3个项目,opt1、opt2、opt3-然后在列表上进行拖放,完成后,我等待在列表的数据提供程序中设置自定义newRank变量。然后在对列表排序之后,我的项目渲染器渲染出5个项目,而不是3个:opt2、opt3、opt1前三个正确排序,opt3、opt3。 我尝试使用基本排序和customFunction进行排序,但无法使其正确排序。任何帮助都将不胜感激 public function so

标题基本上说明了我的问题。我正在对数据提供程序进行排序以获取列表。我的列表上有ItemRenders。生成3个项目,opt1、opt2、opt3-然后在列表上进行拖放,完成后,我等待在列表的数据提供程序中设置自定义newRank变量。然后在对列表排序之后,我的项目渲染器渲染出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;
    }
}

取一个[Bindable]变量并将其放入列表中。。。 在排序函数中,使用该变量并调用refresh。。。 例如


这可能会解决您的重复问题。…

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

我认为这种方法确实有效。不起作用的是列表组件在刷新后绘制数据提供程序。它正在复制项目,我尝试调用invalidateDisplayList和invalidateList来让列表重新绘制自己,但它什么也没做。
[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}"/>