Frage

ich will Live-Suche zu einer Liste hinzuzufügen, deren Datenprovider ist eine sehr große XML. Der Einfachheit halber nehmen wir an, meine XML nur eine Liste der 180ish Länder der Welt:

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;
        }
    }
}

die labelFields Liste werden von dem XML-Elemente <countryName> bevölkert und alphabetisierte.

ich möchte ein Eingabetextfeld erstellen, die für Tastenanschläge und aktualisieren Sie die Liste nach der Eingabekette passend zu den countryElementWerte hören. also wenn ich „kann“ in dem Textfeld eingeben, wird die Liste auf einmal nur 5 Zeilen reduziert werden:

  • Amerikanisch-Samoa
  • Kanada
  • Zentralafrikanische Republik
  • Dominikanische Republik
  • Vatikanstadt

sollte natürlich Live-Suche nicht destruktiv sein als auch - drücken Sie löschen einmal so das Suchfeld liest jetzt „ca“, die die 5-reihigen Liste 21 Zeilen erhöht. (Antarktis, Jamaica, etc.)

Wie wird das gemacht? was ist der schnellste oder am häufigsten verwendeten Ansatz für die Live-Suche und ein XML bereitgestellt Liste Objekt zu aktualisieren?

War es hilfreich?

Lösung

Persönlich, es sei denn, Sie haben einen Grund Ihre Daten als XML zu halten, würde ich die XML-Liste in eine Arraycollection von Objekten ersten transformieren. Wenn Sie das tun, wenn Sie die Daten laden, sollte es Ihnen etwas bessere Leistung insgesamt, vor allem bei größeren Datensätzen.

Aber um Ihre Frage zu beantworten, würde ich so etwas tun. (Dies setzt voraus, dass die XML-Daten in eine Arraycollection-Transformation namens _acData und Sie haben eine andere Arraycollection _acFilteredData aufgerufen, was die Liste Steuerelement gebunden ist Sobald Sie laden die Daten in _acData, kopieren sie sie in _acFilteredData und dann eine Funktion wie diese zu Ihrem Texteingabe)

anhängen
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;
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top