ActionScript-ライブ検索と更新データプロバイダーリスト?
-
08-10-2019 - |
質問
データプロバイダーが非常に大きなXMLであるリストにライブ検索を追加したいと思います。簡単にするために、私のXMLが世界の180か国のリストにすぎないと仮定しましょう。
package
{
//Imports
import fl.controls.List;
import fl.data.DataProvider;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
//Class
public class LiveSearchXMLList extends Sprite
{
//Variables
private var XMLData:XML;
private var dp:DataProvider;
private var list:List;
//Constructor
public function LiveSearchXMLList()
{
addEventListener(Event.ADDED_TO_STAGE, init);
}
//Initialization
private function init(evt:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
//Download XML File
var XMLLoader:URLLoader = new URLLoader();
XMLLoader.addEventListener(IOErrorEvent.IO_ERROR, IOEventErrorHandler);
XMLLoader.addEventListener(Event.COMPLETE, XMLLoaderCompleteEventHandler);
XMLLoader.load(new URLRequest( /* COUNTRY_LIST_XML_FILE */ ));
}
//XMLLoader Error Handler
private function IOEventErrorHandler(evt:IOErrorEvent):void
{
//Remove Event Listeners
evt.target.removeEventListener(IOErrorEvent.IO_ERROR, IOEventErrorHandler);
evt.target.removeEventListener(Event.COMPLETE, XMLLoaderCompleteEventHandler);
//Throw Error
throw(evt.text);
}
//XMLLoader Complete Handler
private function XMLLoaderCompleteEventHandler(evt:Event):void
{
//Remove Event Listeners
evt.target.removeEventListener(IOErrorEvent.IO_ERROR, IOEventErrorHandler);
evt.target.removeEventListener(Event.COMPLETE, XMLLoaderCompleteEventHandler);
//Assign XMLData
XMLData = new XML(evt.target.data);
createList();
}
//List
private function createList():void
{
//Assign And Alphabetize Data
dp = new DataProvider(XMLData);
dp.sortOn("countryName");
//Create List Object
list = new List();
list.width = 400;
list.height = 400;
list.x = list.y = 25;
list.labelField = "countryName";
list.dataProvider = dp;
}
}
}
リストのLabelfieldsにはXML要素が入力されています <countryName>
アルファベット順。
Keystrokesをリッスンし、CountryName要素の値に一致する入力文字列に従ってリストを更新する入力テキストフィールドを作成したいと思います。したがって、テキストフィールドに「CAN」を入力すると、リストは突然5行しか削減されません。
- アメリカのサモア
- カナダ
- 中央アフリカ共和国
- ドミニカ共和国
- バチカン市
もちろん、ライブ検索も非破壊的である必要があります - 一度削除を押すので、検索フィールドは「CA」と読み取られ、5行リストが21行に増加します。 (南極、ジャマイカなど)
これはどのように行われますか? XML提供されたリストオブジェクトをライブ検索および更新するための最速または最も一般的なアプローチは何ですか?
解決
個人的には、データをXMLとして保持する理由がない限り、XMLリストを最初にオブジェクトの配列に変換します。データをロードするときにそうする場合、特により大きなデータセットを使用すると、全体的にパフォーマンスが向上します。
しかし、あなたの質問に答えるために、私は次のようなことをします:(これは、XMLデータを_ACDATAと呼ばれる配列に変換することを前提としています。 _acdata、_acfiltereddataにコピーしてから、このような関数をテキスト入力に添付します)
private function inpFilter_change ( e:Event ) : void
{
var searchString:String = StringUtil.trim(inpFilter.text).toLowerCase();
if ( searchString.length )
{
var newAC:ArrayCollection = new ArrayCollection();
for each ( var tempObject:Object in _acData)
{
if ( tempObject.countryName.toString().indexOf(searchString) != -1 )
{
newAC.addItem(tempObject);
}
}
_acFilteredData = newAC;
listControl.dispatchEvent(new ListEvent(ListEvent.CHANGE)); //might not be necessary, but will force the control to update
}
else
{
_acFilteredData = _acData;
}
}
所属していません StackOverflow