ActionScript-实时搜索和更新DataProvider列表?
-
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>
并按字母顺序排列。
我想创建一个输入文本字段,该字段将侦听击键,并根据匹配乡村名称元素值的输入字符串更新列表。因此,如果我在文本字段中输入“可以”,则列表将突然减少到5行:
- 美国萨摩亚
- 加拿大
- 中非共和国
- 多明尼加共和国
- 梵蒂冈城
当然,实时搜索也应该是无破坏性的 - 按一次删除,因此搜索字段现在读取“ CA”,将5行列表增加到21行。 (南极,牙买加等)
这是怎么做的?实时搜索和更新XML提供的列表对象的最快或最常见方法是什么?
解决方案
就个人而言,除非您有理由将数据保留为XML,否则我将首先将XML列表转换为对象的数组。如果您加载数据时这样做,则应该为您提供总体上更好的性能,尤其是在较大的数据集中。
但是要回答您的问题,我会做这样的事情:(这是您将XML数据转换为称为_ACDATA的arrayCollection,并且您有另一个名为_acfiltereddata的arrayCollection,这是列表控件的绑定。 _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