2013-12-15 6 views
1

У меня есть список искры и использование ArrayCollection в качестве датаподавателя для списка. Изначально, когда список заполняется, сортировка выполняется, но мне нужно добавлять элементы в список довольно часто по мере их обновления на сервере. После того, как я добавлю элемент, мне нужно повторно отсортировать список. После применения сортировки и вызова refresh() scrollbar сбрасывает себя вверх.Сортировочный список без события распространения для сброса полосы прокрутки

Я ищу способ, чтобы добавить элементы в список и сохранить сортировку списка без сброса полосы прокрутки в верхнюю позицию.

Ранее я прочитал аналогичный вопрос, но в этом вопросе большинство пользователей сказали сохранить VerticalScrollPostion в переменной и применить это VerticalScrollPosition назад после завершения сортировки. Проблема заключается в том, что в полосе прокрутки есть рывок, так как он возвращается в начало после обновления, а затем прокручивается назад до положения в соответствии с применяемым. Таким образом, это решение невозможно, так как элементы добавляются очень часто, так как полоса прокрутки идет вверх и вниз очень часто и раздражает пользователей. Также не выглядит красивым n профессиональным

Мне нужен способ, чтобы полоса прокрутки оставалась в нем, даже после сортировки. Также я хочу продолжать использовать useVirtualLayout = true для списка.

Я также пытался расширить ArrayCollection, но не смог найти способ решить мою проблему.

Ниже приведен простой пример (извлеченный из моего основного приложения), чтобы проиллюстрировать проблему. Просто прокрутите список до конца и затем нажмите кнопку «Сортировка» (которая сортирует список), и полоса прокрутки переместится в верхнее положение. Я хочу ScrollBar, чтобы остаться на своей позиции даже после нажатия кнопки Сортировка:

<?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" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)"> 
    <fx:Declarations> 
     <!-- Place non-visual elements (e.g., services, value objects) here --> 
    </fx:Declarations> 
    <fx:Script> 
     <![CDATA[    
      import mx.collections.ArrayCollection; 
      import mx.collections.SortField; 

      import spark.collections.Sort; 
      [Bindable] protected var ar_c:ArrayCollection; 
      protected var dgArray:Array=new Array(); 
      protected function application1_creationCompleteHandler(event:FlexEvent):void 
      { 

       for(var i:int=0;i<20;i++) 
       dgArray.splice(-1,0,{label:"h"+i}); 
       ar_c= new ArrayCollection(dgArray); 

      } 


      protected function sort_list():void{ 
       var sort:spark.collections.Sort=new Sort();    
       sort.fields=[new SortField("label",false,true)]; 
       ar_c.sort=sort; 
       ar_c.refresh(); 

      } 
     ]]> 
    </fx:Script> 
    <s:List x="42" y="41" id="mylist" width="199" height="253" dataProvider="{ar_c}" useVirtualLayout="true"></s:List> 
    <s:Button x="295" y="40" label="Sort" click="sort_list();"/> 
</s:Application> 
+0

Вы уверены, что необходимы 'refresh()' звонки? «Список» должен иметь возможность собирать добавленные элементы без повторного вызова этого метода. –

+0

необходимо обновить вызовы, чтобы реализовать сортировку, поэтому после того, как я добавлю элемент, мне нужно сортировать, чтобы он занял нужное место. Поэтому в основном я хочу знать, как сортировать, не переустанавливая положение полосы прокрутки вверх. – user1190524

+0

Моя точка зрения заключается в том, что 'ArrayCollection' будет сортироваться без какого-либо вызова' refresh() ', и' List' это заметит и соответствующим образом обновит. –

ответ

0

Я думаю sort is applied once and then everything added to ArrayCollection позже сортируется на. Вам нужно только добавить сортировку один раз, а затем вызвать обновление один раз, чтобы применить сортировку.

+0

Спасибо за указание. – user1190524