2011-12-05 40 views
0

我有一個ArrayCollectiondataProviderspark.components.List,它有allowMultipleSelection="true"。有一個「刪除所選項目」按鈕,該按鈕啓動從被單擊的ArrayCollection中刪除所有選定的項目。從ArrayCollection中刪除多個項目使用selectedIndices

我目前使用下面的方法:

myList.selectedIndices.sort(ascendingSort); 

// remove items, counting backwards 
for (var i:uint = myList.selectedIndices.length; i > 0; i--) { 
    myArrayCollection.removeItemAt(myList.selectedIndices[i-1]); 
} 

其中ascendingSort做你所期望的)。它工作正常,我知道它會總是工作。

但是,我確實注意到,如果我完全忽略了這種排序,令我驚訝的是刪除仍然有效。原因是,當調用removeItemAt時,selectedIndices被相應地更新。

所以我的問題是:可以依靠removeItemAt調用更新selectedIndices中的值嗎?或者可能在運行時和/或Flex SDK版本中有所不同?

顯然,如果它是可靠的,那麼忽略這一點將是一個重大的改進。

回答

1

可以依賴removeItemAt調用更新 selectedIndices中的值嗎?

顯然在你的用例中,是的。

或者可能在運行時間和/或Flex版本中顯示不同?

它可能會很好地改變在某個未來的點,或可能以前已經改變。我知道,根據我對基於列表的類的經驗,有時修改dataProvider可能會導致列表返回到「無選擇」狀態。在不允許多選的列表上刪除單個selectedItem就是一個很好的例子。

通常,在我工作過的應用程序中,我不會根據用戶在列表中的選擇從列表中刪除項目;相反,它們通常會根據實際對象中的某些條件刪除(或過濾)出來。該標準通常是一個布爾值,與DataGrid列中顯示的複選框相關。

+0

感謝您的回覆。我更感興趣的是您可能在SDK和運行時期遇到的任何經驗,特別是在實施我感興趣的方法方面,但即使是其他與數據綁定有關的方法也值得您去了解。我想我更基本上問清單中的屬性和底層的dataProvider之間的數據綁定有多可靠。你能舉出Flex 3中存在的任何特定的實現實例,例如,在Flex 3.6或4或4.5中已經改變了嗎? – merv

+0

@merv什麼是「數據綁定相關方法」?對於所有意圖和目的,通過綁定與dataProvider和列表上的屬性沒有關係。也許這個數據綁定的答案將有助於:http://stackoverflow.com/questions/8157901/what-does-the-do/8159057#8159057。在SDK的版本中有很多事例發生了變化;儘管我不知道任何與數據綁定有關的手頭事物。 – JeffryHouser

+1

我很抱歉模糊不清。我試圖通過CollectionChange事件引用對底層dataProvider的更改傳播到List組件的事實。我試圖徵求的具體例子是與實施這種類型的傳播有關的例子。一個非常具體的例子是,在之前的SDK中,更新selectedIndices需要調用「refresh()」。無論如何,我最終只是比較了跨SDK的ListCollectionView.as和ArrayList.as的相關部分,並且從3.0開始代碼似乎基本沒有變化。謝謝。 – merv

0
var indexes:Vector.<Object> = list.selectedItems; 

while(indexes.length > 0) 
{ 
    var item:* = indexes.pop(); 
    var remindex:int = list.dataProvider.getItemIndex(item); 

    if (remindex != -1) 
    { 
     list.dataProvider.removeItemAt(remindex); 
    } 
} 
+1

我很懷疑使用getItemIndex方法會比我的代碼有任何改進(包括排序)。通過單獨搜索每個項目的索引來替換排序索引聽起來像從** O(n log n)**到** O(n²)**算法,但承認取決於getItemIndex的內部實現。你需要用基準來支持它。此外,我的問題是我是否可以完全放棄排序,這將推動** O(n)**的表現! :d – merv