【问题标题】:List ItemRenderer duplicated when Sorting List's dataprovider排序列表的数据提供者时列表项渲染器重复
【发布时间】:2014-05-07 17:24:29
【问题描述】:

标题基本上说明了我的问题。我正在对 dataProvider 进行排序以获取列表。我在列表中有 itemRenderers。构建了 3 个项目,opt1、opt2、opt3 - 然后我在列表上进行拖放,完成后我等待在列表的 dataProvider 中设置我的自定义 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;
    }
}

【问题讨论】:

  • 我认为排序确实有效。刷新后绘制 dataProvider 的 List 组件不起作用。它正在复制项目,我尝试调用 invalidateDisplayList 和 invalidateList 来让列表重绘自身,但它什么也没做。

标签: apache-flex flex3


【解决方案1】:

取一个 [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}"/>

也许这会解决你的重复问题.....

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多