【问题标题】:ActionScript - Live Searching And Updating DataProvider List?ActionScript - 实时搜索和更新 DataProvider 列表?
【发布时间】:2010-11-12 08:51:53
【问题描述】:

我想将实时搜索添加到其数据提供者是一个非常大的 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;
        }
    }
}

列表的标签字段由 XML 元素的 <countryName> 填充并按字母顺序排列。

我想创建一个输入文本字段,它将侦听击键并根据匹配 countryName 元素值的输入字符串更新列表。因此,如果我在文本字段中输入“can”,列表将突然减少到只有 5 行:

  • 美属萨摩亚
  • 加拿大
  • 中非共和国
  • 多米尼加共和国
  • 梵蒂冈城

当然,实时搜索也应该是非破坏性的 - 按一次删除,搜索字段现在显示为“ca”,这会将 5 行列表增加到 21 行。 (南极洲、牙买加等)

这是怎么做到的?实时搜索和更新 XML 提供的列表对象的最快或最常用的方法是什么?

【问题讨论】:

    标签: xml actionscript-3 list search livesearch


    【解决方案1】:

    就个人而言,除非您有理由将数据保留为 xml,否则我会先将 xml 列表转换为对象的 arrayCollection。如果您在加载数据时这样做,它应该会给您带来更好的整体性能,尤其是对于较大的数据集。

    但要回答您的问题,我会这样做:(假设您将 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;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多