例 : ICollectionView インターフェイスのメソッドとプロパティを使用した配列の更新

次の例では、ArrayCollection オブジェクトの ICollectionView のメソッドとプロパティを使用して、次のエレメントを持つ配列を ComboBox コントロールに表示します。

"AZ", "MA", "MZ", "MN", "MO", "MS"

[Update View] ボタンをクリックすると、ICollectionView インターフェイスの length プロパティといくつかのメソッドを使用して次のことが行われます。

[Sort] ボタンをクリックすると、ビュー内のアイテムの順序が逆になり、ME ~ MO の範囲のみが表示されます。

[Reset] ボタンをクリックすると、データプロバイダの配列とコレクションビューがリセットされます。

<?xml version="1.0"?>

<!-- dpcontrols\UpdateArrayViaICollectionView.mxml -->

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"

initialize="initData();">

<mx:Script>

<![CDATA[

import mx.collections.*;

// データプロバイダは String の配列

public var myArray:Array = ["AZ", "MA", "MZ", "MN", "MO", "MS"];

// Array を表す ArrayCollection を宣言する

// ComboBox を適切に更新できるようにするため、変数をバインド可能にする

[Bindable]

public var myAC:ArrayCollection;

// 更新ルーチンが以前に実行されていないことを確認するための Boolean フラグ

public var runBefore:Boolean=false;

// アプリケーションによって初期化された ArrayCollection を初期化する

public function initData():void {

myAC = new ArrayCollection(myArray);

}

// コレクションを変更する関数

public function changeCollection():void {

// リセットせずに 2 回実行するとエラーが発生する

if (! runBefore) {

runBefore=true;

// コレクションのデータにアクセスするために IViewCursor オブジェクトを取得する

var myCursor:IViewCursor=myAC.createCursor();

// 元のコレクションの長さを取得する

var oldLength:int=myAC.length;

// カーソルは初期状態では先頭のアイテムにあります。このアイテムを削除する

var removedItem:String=String(myCursor.remove());

// 2 番目のアイテムとして ME を追加する。

// カーソルは (新しい) 先頭のアイテムにある

// カーソルを 2 番目のアイテムに移動する

myCursor.moveNext();

// 2 番目のアイテムの前に ME を挿入する

myCursor.insert("ME");

// コレクションの末尾に MT を追加する

// LAST ブックマークプロパティを使用してビューの末尾に移動する

// 最後のアイテムの後にカーソルを配置するため、オフセット 1 を加算する

myCursor.seek(CursorBookmark.LAST, 1);

myCursor.insert("MT");

// MZ を MI に変更する

// findFirst() メソッドのためにビューをソートする

var sort:Sort = new Sort();

myAC.sort=sort;

// コレクションビューを更新してソートを適用する

myAC.refresh();

// 配列内に MZ アイテムがあり、MI アイテムがないことを確認する

if (myCursor.findFirst("MZ") && !myCursor.findFirst("MI")) {

// IViewCursor には置換機能はない

// まず、"MZ" を削除する

myCursor.remove();

// ビューがソートされているため、insert はこのアイテムを

// 基になる Array データプロバイダの末尾ではなく、

// ソートされたビュー内の正しい位置に挿入する

myCursor.insert("MI");

}

// 更新後のコレクションの長さを取得する

var newLength:int=myAC.length;

// 値 ME を持つアイテムにブックマークを設定する

myCursor.findFirst("ME");

var MEMark:CursorBookmark=myCursor.bookmark;

// Array の最後のアイテムにカーソルを移動する

myCursor.seek(CursorBookmark.LAST);

// コレクション内の最後のアイテムを取得する

var lastItem:String=String(myCursor.current);

// ブックマーク位置にカーソルを戻す

myCursor.seek(MEMark);

// カーソル位置にあるアイテムを取得する

var MEItem:String=String(myCursor.current);

// TextArea コントロールに情報を表示する

ta1.text="Start Length: " + oldLength + ".End Length: "

+ newLength;

ta1.text+=".\nRemoved " + removedItem;

ta1.text+=".\nLast Item is " + lastItem;

ta1.text+=".\nItem at MEMark is " + MEItem;

// 基になる Array が変更されたことを示す

// Array の順序はソートされていない

ta1.text+="\nThe base Array is: " + myArray.join();

} // runBefore 条件の終わり

}

// 範囲を制限するために sortICV メソッドで使用するフィルタ関数

public function MEMOFilter(item:Object):Boolean {

return item >= "ME" && item <= "MO";

}

// コレクションビューを降順にソートし、

// アイテムの範囲を ME ~ MO に制限する

public function sortICV():void {

var sort:Sort = new Sort();

sort.fields=[new SortField(null, false, true)];

myAC.filterFunction=MEMOFilter;

myAC.sort=sort;

// ArrayCollection を更新して、ソートとフィルタ関数を

// 適用する

myAC.refresh();

// ComboBox の selectedIndex() メソッドを呼び出して、表示内の "MA" を

// ソートされたビューの最初のアイテムに置換する

myCB.selectedIndex=0;

ta1.text="Sorted";

}

// Array をリセットして表示を更新し、この例をもう一度実行する

public function resetView():void {

myArray = ["AZ", "MA", "MZ", "MN", "MO", "MS"];

myAC = new ArrayCollection(myArray);

ta1.text="Reset";

runBefore=false;

}

]]>

</mx:Script>

<mx:ComboBox id="myCB" rowCount="7" dataProvider="{myAC}"/>

<mx:TextArea id="ta1" height="75" width="300"/>

<mx:HBox>

<mx:Button label="Update View" click="changeCollection();"/>

<mx:Button label="Sort View" click="sortICV();"/>

<mx:Button label="Reset View" click="resetView();"/>

</mx:HBox>

</mx:Application>

Flex 2.01